2014-09-12 32 views
35

È possibile verificare se un dato attributo è presente in una direttiva, idealmente utilizzando l'ambito isolato o, nel peggiore dei casi, l'oggetto attributi.Verifica esistenza attributo nella direttiva angolare

Con una direttiva simile a questa <project status></project>, voglio rendere condizionatamente un'icona di stato, ma solo se l'attributo status è presente.

return { 
    restrict: 'AE', 
    scope: { 
    status: '@' 
    }, 
    link: function(scope, element, attrs) { 
    scope.status === 'undefined' 
    } 
} 

Idealmente, sarebbe legato direttamente allo scopo, in modo che potesse essere utilizzato nel modello. Tuttavia, il valore della variabile associata è non definito. Lo stesso vale per &a lettura singola e =attacchi a due vie.

So che è banalmente risolto aggiungendo un <project status='true'></project>, ma per le direttive che userò frequentemente, preferirei non doverlo fare. (Validità XHTML, non è un problema).

+0

So che l'hai menzionato, ma solo chiedendo - di d hai provato qualcosa come '" status "in attrs' e vedi che cos'è questa valutazione? – Ian

+0

non è "@" un'associazione di testo unidirezionale passata alla direttiva? quindi scope.status dovrebbe essere il testo che legge 'true', purché si passi una variabile nella direttiva come SoluableNonagon

+0

Quando si specifica l'ambito come un oggetto come sopra, la direttiva crea un nuovo oggetto Scope che non eredita le proprietà da ambito genitore. Utilizzare invece scope: true per creare un nuovo ambito (con accesso alle proprietà dell'ambito padre), o scope: false per fare in modo che la direttiva usi l'ambito principale. È questo che stai chiedendo? Non ho proprio capito la tua domanda ... –

risposta

60

Il modo per farlo è quello di verificare l'esistenza degli attributi all'interno parametro attrs della funzione di collegamento e assegnarlo a variabili all'interno dell'ambito isolato della direttiva.

scope:{}, 
link: function(scope, element, attrs){ 
    scope.status = 'status' in attrs; 
}, 

Questo dovrebbe funzionare senza dover utilizzare un'istruzione if nella funzione di collegamento.

17

Il modo per fare quello che vuoi è di guardare l'oggetto attributo nella funzione di collegamento:

link: 
    function(scope, element, attrs) { 
    if("status" in attrs) 
     //do something 
    } 
1

Poiché il valore attrs è il tipo di javascript object. Per verificare l'esistenza degli attributi possiamo anche usare il metodo hasOwnProperty() invece la parola chiave in.

Quindi, potrebbe essere:

link: function(scope, element, attrs) { 
    var is_key_exist = attrs.hasOwnProperty('status');//Will return true if exist 
} 

Si può leggere ulteriormente la differenza tra la parola chiave e inhasOwnProperty() metodo in questa link

2

per controllare per gli attributi quando si utilizza componenti 1.5+ angolari è possibile utilizzare la $ postLink lifecycle hook e il servizio $ element in questo modo:

constructor(private $element) {} 

$postLink() { 
    if(!this.$element.attr('attr-name')){ 
    // do something 
    } 
}