2015-12-22 15 views
8

Sto creando una grande quantità di direttive e tutto sarà includere variabili scope dinamico che sarà inizializzato all'interno delle funzioni di collegamento esempio:

// 
link: function(scope, ele, attr){ 
    scope.key = scope.somevar + 'something_else'; 
    scope[scope.key] = 'the_value'; 
} 
// 

voglio accedere il valore nei modelli delle direttive tramite scope.key.

<div ng-if="scope[key]"> something </div> 

Attualmente vedo solo fosse stato fattibile attraverso una chiamata di funzione in questo modo:

html

<div ng-if="scope(key)"> something </div> 

js

scope.scope = function(key) { 
    return scope[key]; 
} 

Ma allora il problema è Avrò bisogno di t o copia questo in tutte le direttive.

Un'altra opzione che ho preso in considerazione è stata quella di assegnare la funzione getter allo $rootScope rendendola accessibile a livello globale, ma come collegarla o passare nell'ambito delle direttive attuali. (Se possibile anche).

Quale sarebbe un buon approccio a questo?

+0

'scope [chiave]' non funziona perché non si dispone di un oggetto ambito sull'oscilloscopio. Prova 'ng-if =" keyContainer [chiave] "' e avendo 'scope.keyContainer = {}; scope.keyContainer [scope.key] = * val * ' –

risposta

13

Dentro del modello angolare this punti chiave per il contesto di valutazione corrente, ovvero ambito corrente. Ciò significa che si sarebbe in grado di realizzare ciò che si sta dopo utilizzando la notazione staffa sull'oggetto this:

<div ng-if="this[key]"> something </div> 
+1

Mi blocco la testa per la vergogna di non aver provato "questo". Perdonate il gioco di parole. Grazie! – Kiee

+0

Sono contento che sia stato d'aiuto, non molte persone sanno di questo "trucco", in realtà. Adesso lo sai anche tu. – dfsq

+1

L'uso di 'this' è molto pericoloso, perché alcune direttive creano un proprio ambito. Il modo migliore è usare la sintassi 'controllerAs'. –

0

Sarebbe più facile per vedere tutto il codice, ma suona come si può solo creare una funzione sul vostro scopo di recuperare il valore:

scope.getValue = function() { 
    return scope[scope.key]; 
} 

Poi, nel tuo HTML:

<div ng-if="getValue()"> something </div> 
+0

Grazie per la risposta, tuttavia hai appena duplicato quello che ho fornito nella domanda sostituendo solo i nomi. – Kiee

+0

scusa .. che scope.scope era un po 'confuso. – mcgraphix

2

Usa bindToController opzione nel tuo direttiva

JS

bindToController: true, 
controller: 'MyController', 
controllerAs: 'ctrl', 
link: function(scope, ele, attr){ 
    scope.ctrl.key = scope.somevar + 'something_else'; 
    scope.ctrl[scope.ctrl.key] = 'the_value'; 
} 

HTML

<div ng-if="ctrl[ctrl.key]"> something </div> 

Controllare questa codepen come esempio: http://goo.gl/SMq2Cx

+0

Grazie per l'intuizione, non ero consapevole che si potesse fare questo. – Kiee

+0

ControllerAs sarebbe davvero una buona idea. Tuttavia, non nel modo in cui lo utilizzi nel tuo esempio. Non si desidera avere l'alias del controller nella funzione di collegamento. bindToController è la strada da percorrere in questo caso. – dfsq