2016-01-06 3 views
9

Моя текущая реализация:Угловая дублирования избежать кода при использовании `нг-if`

<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> 

Приведенный выше код работает, но есть много повторения кода:

  1. ng-if дважды там (ng-switch не может использоваться, так как новый элемент вводится между ними)
  2. <div ng-if="!isShow" class="inner-class-1">{{item}}</div> повторяется дважды, просто потому, что я не хочу, чтобы элемент (<div class="inner-class"></div>) инкапсулировал мои данные, когда ng-if оценивает значение false.

Мне было интересно, может быть, если есть лучший способ переписать то же самое.

+0

Вы не хотите внутреннего класса-1 элемент, который будет завернутые в другом элементе все вместе или просто не иметь родителя с классом внутреннего класса ? – Nora

+0

Я не хочу, чтобы элемент 'inner-class-1' присутствовал, когда выражение ng-if оценивается как false. –

+0

Я думаю, что было бы лучше реорганизовать ваш CSS, чтобы стиль и поведение, которые вы хотите переключить, можно сделать на основе существования класса «внутренний класс». Я имею в виду, что наличие оберточного div не имеет никакого значения, только сам класс должен изменить ситуацию. – ste2425

ответ

1

В этом случае вы бы лучше создавать пользовательские директивы, которые могут условно обернуть содержимое. Вы могли бы сделать что-то вроде этого:

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

Не будет ли убийцей производительности использовать наблюдателя внутри 'ng-repeat'? –

+0

Не очень, если вы используете его с умом. ngIf делает то же самое: https://github.com/angular/angular.js/blob/master/src/ng/directive/ngIf.js Но дело не в директиве wrapIf, а о том, как она используется (не обязательно с ngRepeat) и что он делает. – dfsq

+0

О да, '::' - одно время привязка может помочь мне здесь. 'Наматывается если = ":: isShow"' –

1

Возможно, что-то вроде этого?

//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; 
 
     } 
 
    }; 
 
});

Чтобы использовать так:

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

+0

Это решение не будет работать, я думаю. Прежде всего, директива не может использоваться повторно, потому что шаблон жестко запрограммирован. Затем 'show-wrapper' используется как атрибут, который не позволяет изменять обертку условно. Наконец, он использует еще одну оболочку, которая не очень удобна для целей директив. – dfsq

Смежные вопросы