2013-05-04 14 views
7

Scrivo un'applicazione molto complessa su Angularjs. Questo è già abbastanza grande da confondermi. Studio Angular in modo più approfondito e vedo che il mio codice è cattivo. Ho capire questo concetto:Direttiva AngularJS: modello di compilazione e ambito di controllo

module.directive('createControl', function($compile, $timeout){ 
    scope: { 
      // scope bindings with '=' & '@' 
      },                             
    template: '<div>Template string with binded {{ variables }}</div>',   
    link: function(scope, element, attrs){ 
      // Function with logic. Should watch scope. 
      } 

ho diversi problemi:

  • Il mio modello è complicato, ho parte del modello che va nella funzione di collegamento dinamico
  • ho bisogno di aggiungere template compilato per l'elemento, non per sostituire.
  • Con concetto di cui sopra il mio modello vengono aggiunti senza alcuna interpolazione ...

Quindi il mio codice è alla ricerca di simile in vista semplificata:

module.directive('createControl', function($compile, $timeout){ 
    scope: { 
       var1: '@var1', 
       var2: '@var2', 
       var3: '@var3' 
      },                             
    template: '<div>{{ var1 }} {{ var3 }}</div>',   
    link: function(scope, element, attrs){ 
       $('.someelement').on('event', function(){ 
       var2 = 'SNIPPET'; // Need to watch it 
       }); 
       var3 = '<span>{{ var2 }}</span>'; 
      } 
    }) 

Le mie domande sono:

Come compilare il mio modello con variabili scope?

Come visualizzare le variabili di ambito?

Devo dividere la mia direttiva per due? Se dovessi, come farlo nel modo giusto?

+0

se disposti ad utilizzare angolare 1.4, funzione per 'template' stato aggiunto che consente l'accesso agli attributi http://code.angularjs.org/1.1.4/ docs/guide/direttiva – charlietfl

+0

@charlietfl, potresti inserire il tuo commento come risposta con un esempio di codice? – I159

+1

Mi sbaglio o potresti evitare di usare jQuery mescolato con angolare? – Ismael

risposta

3

Credo che cambiare la direttiva da:

module.directive('createControl', function($compile, $timeout){ 
    scope: { 
       var1: '=var1', 
       var2: '=var2', 
       var3: '=var3' 
      },                             
    template: '<div>{{var1}} {{var3}}</div>',   
    link: function(scope, element, attrs){ 
       $('.someelement').on('event', function(){ 
       scope.var2 = 'SNIPPET'; // Need to watch it 
       }); 
       /*I do not see what you want to do*/ 
       scope.var3 = $compile('<span>{{var2}}</span>')(scope); 
      } 
    }) 
10

angolare 1.1.4 rilasciato in ultime settimane capacità aggiunto per template per accedere agli attributi in direttive:

Esempio:

app.directive('mytest',function(){ 
    return { 
    restrict:'E',  
    template:function(elem,attrs){  
     return '<div>'+attrs.a+' '+attrs.b+'</div>'; 
    } 
    } 
}); 
<mytest a="Hello" b="World"></mytest> 

DEMO

Vedi directive docs for version 1.1.4

+0

Nota se ho avuto lo stesso problema dell'OP ma questo mi ha fatto risparmiare un sacco di tempo grazie per aver postato. – CallumD

+1

Ho solo pensato di far notare che il link che hai aggiunto per i documenti non funziona direttamente collegato per qualsiasi motivo. Devi andare a [qui] (http://code.angularjs.org/1.1.4/docs/api) e quindi cercare "direttive" in alto a destra. – forrestranger

Problemi correlati