2016-02-25 14 views
5

Desidero applicare una direttiva semplice in modo condizionale utilizzando ngAttr. Non capisco perché la mia direttiva sia sempre visualizzata. Quindi se ho una variabile indefinita/falsa voglio applicare la mia direttiva: dirr.Come applicare la direttiva in modo condizionale in AngularJS?

Quando si utilizza ngAttr, il allOrNothing bandiera $ interpolare viene utilizzato, quindi se qualsiasi espressione di una stringa interpolati in indefinito, l'attributo viene rimosso e non aggiunti all'elemento.

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 si dovrebbe evitare di nominare le proprie variabili, direttive ecc. sotto lo spazio dei nomi 'ng' (' $ scope.ngVar'). Questo è per componenti angolari di base e potrebbe causare confusione per i futuri sviluppatori. – ste2425

+0

@ ste2425 è un esempio veloce, si prega di essere in argomento !! – que1326

+2

Dice "FYI" come nota a margine, non "I am on the topic"! –

risposta

0

Le risposte sono vere e la codice di esempio ha fornito opere per piccoli problemi, ma quando si tratta di risolvere questo problema su applicazioni di grandi dimensioni si consiglia di adottare questo approccio:

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

questo è più ordinata e non si può decidere di duplicare il codice utilizzando ngIf o ngSwitch direttive in div separato quando si ha qualcosa di simile:

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

Tranne che nessun collegamento angolare nel codice HTML aggiunto non verrà associato.Dovresti usare il servizio '$ compile', non jquery/jqlite. – ste2425

+0

@ ste2425 fornire un esempio, non sono sicuro di cosa intendessi. – que1326

+1

Spero che questo possa essere d'aiuto. https://jsfiddle.net/q9cqquLe/ Potrebbe essere meglio avere questa logica non in ogni direttiva, ma avere una singola utilità che faccia questa logica per il fatto che si passi il nome della direttiva per applicare in modo condizionale. – ste2425

4

Si può fare uso della direttiva integrato di AngularJS ng-if per verificare la condizione ed eseguirlo condizionale.

Esempio:

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

Non riesco a utilizzare ng-if nel mio contesto – que1326

+0

perché, wat è il problema? o vai con 'ng-switch'. – Shashank

+0

Ho risposto con una risposta thread. – que1326

1

documentazione Modulo

Tutte le direttive angolare disponibile Match nome attributo, nome di tag, commenti, o il nome della classe

così ogni volta angolare corrisponde a una diretiva con nome attributo, compila il modello e rende l'html indipendentemente da valore dell'attributo.

in ogni caso è possibile utilizzare la portata della direttiva template.so uso ng-pelle con la proprietà nascosta di portata

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; 
}]); 
Problemi correlati