2016-02-25 2 views
5

Я хочу применить простую директиву условно, используя ngAttr. Я не понимаю, почему моя директива всегда отображается. Поэтому, если у меня есть переменная undefined/false, я хочу применить свою директиву: dirr.Как применять директиву условно в AngularJS?

При использовании ngAttr, в allOrNothing флага $ интерполирует используется, так что если любое выражение в интерполированных результатах строки в неопределенных, атрибут удаляется и не добавляется к элементу.

My code pen

<div ng-app="myApp" ng-controller="MainController" class="container-fluid"> 
    <h2 ng-bind="currentVersion"></h2> 
    <hr> 
    <div ng-attr-dirr="hidden || undefined">Default div</div> 
</div> 

angular.module('myApp',[]) 
.directive('dirr', function(){ 
    return { 
    restrict:'AE', 
    template:'<div>Div from directive</div>' 
    } 
}) 
.controller('MainController',['$scope', function($scope){ 
    $scope.currentVersion = 'Angular 1.3.6'; 
    $scope.hidden = undefined; 
}]) 
; 
+2

FYI вы должны избегать имен собственных переменных, директивы и т. д. в пространстве имен 'ng' (' $ scope.ngVar'). Это для основных угловых компонентов и может вызвать путаницу для будущих разработчиков. – ste2425

+0

@ ste2425 это быстрый пример, пожалуйста, по теме !! – que1326

+2

Он говорит «FYI» как побочное примечание, а не «Я на тему»! –

ответ

0

ответы верны и пример кода вы предоставили работу для мелких вопросов, но когда речь идет о решении этой проблемы на больших приложениях, которые вы можете принять этот подход:

Updated Pen

<div ng-app="myApp" ng-controller="MainController" class="container-fluid"> 
    <h2 ng-bind="currentVersion"></h2> 
    <hr> 
    <div dirr value="{{hidden}}">Default div</div> 
    </div> 

.directive('dirr', function($log){ 
    var directiveInstance = { 
    restrict:'AE', 
    scope:{ 
     value:'@' 
    }, 
    link: function (scope, element, attrs, ctrl) { 
     if(attrs.value === 'true'){ 
     console.log('directive on !!'); 
     $log.debug('element',element); 
     element[0].innerHTML = '<div>hello ' + attrs.value + '</div>'; 
     } 
     else { 
     console.log('directive off !!'); 
     } 
    } 
    } 
    return directiveInstance; 
}) 

Это более аккуратный и вы не можете продублировать свой код, используя ngIf или ngSwitch директивы в отдельном дивы, когда у вас есть что-то вроде:

<table> 
    <thead dirr value="{{statement}}"> 
    <tr> 
    <th> 
     CrazyStuffHere... 
    </th> 
    <th> 
     CrazyStuffHere... 
    </th> 
    .... 
    </tr> 
    </thead> 
</table> 
+0

За исключением любых угловых привязок в вашем добавленном HTML, вы не будете связаны.Вам нужно будет использовать службу '$ compile', а не jquery/jqlite. Например, – ste2425

+0

@ ste2425, я не уверен, что вы имели в виду. – que1326

+1

Надеюсь, это поможет. https://jsfiddle.net/q9cqquLe/ Лучше иметь эту логику не в каждой директиве, а иметь одну полезную утилиту, которая делает эту логику для того, чтобы вы передали имя директивы для условного применения. – ste2425

4

Вы можете использовать встроенные директивы AngularJS ng-if игровых для проверки состояния и выполнить его условно.

Пример:

<div ng-if="{some_condition}"> 
    <dirr></dirr> <!--Execute the directive on the basis of outcome of the if condition--> 
</div> 
+0

Я не могу использовать ng-если в моем контексте – que1326

+0

Почему, Ват проблема? или перейдите в 'ng-switch'. – Shashank

+0

Ответил ответ на вопрос. – que1326

1

Форма документации

Все Угловое предоставленные директивы совпадать с именем, имя тега, комментарии или имя класса

так, когда атрибут угловой соответствует директиве с именем атрибута, он компилирует шаблон и отображает html независимо от значение атрибута.

в любом случае вы можете использовать рамки в директиве template.so использования нг скрытие со скрытым свойством прицела

angular.module ('MYAPP', [])

.directive('dirr',function(){ 
    return{ 
     restrict:'AE', 
     template:'<div ng-hide="hidden">Div from directive</div>', 
    } 
}) 
.controller('MainController',['$scope', function($scope){ 
    $scope.hidden=false; 
}]); 
Смежные вопросы