2016-01-06 16 views
9

Benim şu anki uygulama:Açısal önlemek kod çoğaltılması `ng-if` kullanılarak

<div class="outer-class" ng-repeat="item in items"> 
    <div class="inner-class" ng-if="isShow"> 
    <div class="inner-class-1">{{item}}</div> 
    </div> 
    <div ng-if="!isShow" class="inner-class-1">{{item}}</div> 
</div> 

Yukarıdaki kod çalışır, ancak kod tekrarı bir sürü vardır:

  1. ng-if orada iki katı olduğu (ng-switch,
  2. <div ng-if="!isShow" class="inner-class-1">{{item}}</div> öğesinin yeni bir öğe eklendiğinden beri kullanılamaz, yalnızca öğeyi (<div class="inner-class"></div>) veriyi kapsüllemek istemediğim için iki kez yinelenir, false değerini değerlendiriyor.

Belki de yeniden yazmak için daha iyi bir yol varsa merak ediyordum.

+0

Sen iç sınıf-1 eleman istemiyoruz hep birlikte başka bir öğe sarılı olan ya da sadece sınıf içi sınıf ile bir üst var değil ? – Nora

+0

ng-if ifadesi false olarak değerlendirildiğinde, "iç sınıf-1" öğesinin var olmasını istemiyorum. –

+0

CSS'nizi yeniden yönlendirmek daha iyi olur, böylece geçiş yapmak istediğiniz stil ve davranış, 'iç sınıf' sınıfının varlığına dayalı olarak yapılabilir. Demek istediğim, sanırım saranın varlığı bir fark yaratmıyor, sadece sınıfın kendisi bir şeyi değiştirmeli. – ste2425

cevap

1

Eğer şartlı içeriğini sarabilirdiniz özel direktifi oluşturarak kapalı daha iyi olurdu Bu durumda. Böyle bir şey yapabileceğini:

angular.module('demo', []).controller('DemoController', function($scope) { 
 
    $scope.items = [1, 2, 3]; 
 
    $scope.isShow = false; 
 
}) 
 

 
.directive('wrapIf', function() { 
 
    return { 
 
    restrict: 'A', 
 
    transclude: true, 
 
    link: function(scope, element, attrs, controller, transclude) { 
 

 
     var previousContent; 
 

 
     scope.$watch(attrs.wrapIf, function(newVal) { 
 
     if (newVal) { 
 
      previousContent.parent().append(element); 
 
      element.empty().append(previousContent); 
 
     } else { 
 
      transclude(function(clone, scope) { 
 
      previousContent = clone; 
 
      element.replaceWith(clone); 
 
      }); 
 
     } 
 
     }) 
 
    } 
 
    }; 
 
});
.inner-class, .inner-class-1 { 
 
    padding: 6px; 
 
    background: #DDD; 
 
} 
 
.inner-class-1 { 
 
    background: #34dac3; 
 
} 
 
.outer-class { 
 
    margin-bottom: 6px; 
 
}
<script src="https://code.angularjs.org/1.4.8/angular.js"></script> 
 

 
<div ng-app="demo" ng-controller="DemoController"> 
 

 
    <p> 
 
    <button ng-click="isShow = !isShow">Toggle isShow ({{ isShow }})</button> 
 
    </p> 
 

 
    <div class="outer-class" ng-repeat="item in items"> 
 
    <div class="inner-class" wrap-if="isShow"> 
 
     <div class="inner-class-1" ng-click="test(item)">{{item}}</div> 
 
    </div> 
 
    </div> 
 

 
</div>

+0

Bir “ng-repeat” içinde bir izleyici kullanmak bir performans katili olmaz mıydı? –

+0

Eğer akıllıca kullanırsan gerçekten değil. ngIf aynı şeyi yapar: https://github.com/angular/angular.js/blob/master/src/ng/directive/ngIf.js Ancak, nasıl kullanıldığına dair yönergeler hakkında değil (zorunlu olarak ngRepeat ile değil) ve ne yapar? – dfsq

+0

Oh evet, '::' - bir kez bağlama bana burada yardımcı olabilir. 'Sarmak eğer = ":: isShow"' –

1

Belki böyle bir şey?

//optional wrapper 
 

 
function resolveTemplate(tElement, tAttrs) { 
 
    if (tAttrs.showWrapper){ 
 
    return "<div ng-class='wrapperClass' ng-transclude></div>" 
 
    } 
 
    else return "<ng-transclude></ng-transclude>"; 
 
} 
 

 
app.directive('optionalWrapper', function() { 
 
    return { 
 
     restrict: 'E', 
 
     transclude: true, 
 
     template: resolveTemplate, 
 
     link: function($scope, el, attrs) { 
 
      $scope.wrapperClass = attrs.wrapperClass; 
 
     } 
 
    }; 
 
});

bu gibi kullanılabilir için:

<optional-wrapper wrapper-class='inner-class-1' show-wrapper='isShow'></optional-wrapper>

+0

Bu çözüm iyi çalışmayacak, sanırım. Öncelikle, yönerge yeniden kullanılamaz çünkü şablon kodlanmış. Ardından, "show-wrapper", koşullu olarak kaydırma değiştirmeye izin vermeyecek bir özellik olarak kullanılır. Son olarak, direktifler için çok uygun olmayan bir sarıcı kullanır. – dfsq

İlgili konular