2013-04-30 19 views
16

Qualche idea su come accedere ai valori degli attributi dall'interno della direttiva?Direttive AngularJs - come ottenere i valori degli attributi dalla direttiva

angular.module('portal.directives', []) 
     .directive('languageFlag', ['$routeParams', function(params) { 
      return function(scope, element, attrs) { 
       console.log(attrs["data-key"]); // returns undefined 
       console.log(element.attr('data-key')); // returns {{data-key}} 
       angular.element(element).css('border', '1px solid red'); 
      }; 
     }]); 

codice HTML è:

<ul> 
    <li ng-repeat="lng in flags"> 
     <a class="lngFlag {{flag.Key}}" data-key="{{flag.Key}}" data-id="{{lng.Id}}" ng-click="changeLangHash({'lng':lng.Id })" language-flag></a> 
    </li> 
</ul> 

Grazie

+0

basta seguire la custodia del cammello in caso di trattino - –

risposta

23

Uso $observe:

Osservando interpolata attributi: Uso $observe per osservare la variazione di valore di attributi che contengono interpolazione (ad esempio src="{{bar}}"). Non solo è molto efficiente, ma è anche l'unico modo per ottenere facilmente il valore effettivo perché durante la fase di collegamento l'interpolazione non è stata ancora valutata e quindi il valore è in questo momento impostato su undefined. - directives doc

return function(scope, element, attrs) { 
    attrs.$observe('key', function(value) { 
     console.log('key=', value); 
    }); 
} 

Come @FMM menzionato in un commento, data si spoglia da angolare quando normalizza il nome dell'attributo, quindi l'uso di key sopra, anziché dataKey.

+1

Grazie. Funziona su tutti gli attributi tranne quelli con notazioni a serpente. Come dati, qualcosa. Ma accetto la tua risposta perché funziona effettivamente con altri attributi. Apprezzo il tuo impegno e il tuo tempo. –

+2

È probabile che l'angolare ritagli il prefisso 'data' (http: //docs.angularjs.org/guida/direttiva): "Opzionalmente la direttiva può essere preceduta da x-, o data- per renderla conforme al validatore HTML." Probabilmente è una cattiva idea avviare i nomi degli attributi (logici) con "data". – FMM

10

provare attrs["dataKey"] - questo è il modo in cui HTML analizza gli attributi con trattino (-). se si desidera che il valore dal campo di applicazione, invece di {{something}}, si possono fare due cose:

scope[attrs['dataKey']] - funzionerà ma non dovrebbe fare questo

o utilizzare $parse ma allora non usare `` {{ }} `

app.directive('languageFlag', ['$routeParams','$parse', function(params,$parse) { 
    return function(scope, element, attrs) { 
    var value = $parse(attrs.dataKey)(scope); 
    console.log(value); 
    angular.element(element).css('border', '1px solid red'); 
    }; 
}]); 

oppure è possibile utilizzare $interpolate allo stesso modo come $parse ma con {{}}

+0

Grazie per aver risposto. console.log (attrs ["dataKey"]); // = undefined console.log (scope [attrs ['dataKey']]); // = undefined Ho persino rimosso tutti i {{}} e ho provato. $ parse ma ancora 'indefinito'. Non c'è un modo per accedere semplicemente al modello sottostante al momento del bind? –

+0

Il passaggio dell'ambito principale a $ parse (ad es .: '$ parse (attrs.uid) ($ scope. $ Parent)') ha risolto il problema – manikanta

+0

@ g00fy Ma se l'attributo è un valore binded a due vie? Il mio codice lo analizzerà solo sul carico della direttiva, ma non noterà mai le modifiche apportate alla variabile (dall'ambito principale). –

1

Io suggerirei di usare la notazione oggetto se si è all'interno della funzione di collegamento della direttiva, che ottiene il parametro attrs:

attrs.yourAttributeName

4

strisce angolari 'dati-' fuori gli attributi, quindi se il tuo attributo è 'data-key', usa solo 'chiave', non 'dataKey'

+0

Ho un attributo con nome "data-actiontype" con solo actiontype Non sto ottenendo i dati da quell'attributo. Questo nome è predefinito? – Kathir

+0

@Kathir Difficile dire senza vedere il tuo codice. Spero che tu l'abbia capito da quando hai chiesto 14 ore fa. In caso contrario, dovresti essere in grado di guardare le risposte su questa pagina e provare un paio di cose diverse, capirlo. –

+0

Grazie per la risposta. Si prega di vedere il mio tag sotto '' Attualmente sono rimuovendo 'data-' dal tag. Non sono ancora scoperto. – Kathir

Problemi correlati