2013-03-08 9 views
18

In questo documento: http://docs.angularjs.org/guide/directive, le direttive possono comunicare tra loro da parte dei controllori.Come comunicano le direttive da un controller?

controller - Funzione di controllo del regolatore. Il controllore viene istanziato prima della fase di pre-collegamento ed è condiviso con altre direttive se lo richiedono per nome (vedi attributo require). Ciò consente alle direttive di comunicare tra loro e aumentare il comportamento degli altri.

Non lo capisco bene, come hanno comunicato con i controller? C'è qualche esempio o demo per questo?

+2

Controllare [questa domanda] (http: // StackOverflow. it/questions/14915332/what-does-require-of-directive-definition-object-take) e [questo esempio] (http://jsfiddle.net/bmleite/GSZkJ/). – bmleite

+1

Continuate con buone domande. – Stewie

+1

[quell'esempio] (http://jsfiddle.net/bmleite/GSZkJ/) è un po 'fuorviante. a prima vista sembra che condivida la proprietà 'num' delle istanze del controllore. quando l'unica cosa che sta realmente accadendo è che la direttiva interna copi la funzione di incremento dall'istanza del controller delle direttive esterne all'oggetto dello scope che condivide sia la parte interna che quella esterna. quando viene chiamato dal modello this == l'oggetto scope. vedi questo [esempio ottimizzato] (http://jsfiddle.net/fess/a68Ra/) che prova ad illustrare quei punti. –

risposta

34

Forse stai confondendo un controller che viene creato quando si verifica una modifica di rotta con un controller di direttiva. Quella sezione parla solo di controller di direttiva, quindi ciò che significa questa sezione è che se si hanno due direttive sullo stesso elemento HTML, possono comunicare richiedendo i rispettivi controller.

Un buon esempio è se si crea una direttiva che deve comunicare con ng-model. Dal momento che ng-model espone un controller, è possibile richiedere in questo modo:

myApp.directive('myDirective', function() { 
    return { 
     require: 'ngModel', 
     link: function($scope, elem, attrs, ngModelCtrl) { 
      // Here you can listen to different DOM events, and 
      // call ngModelCtrl when the model value needs to update 
     } 
    } 
}); 

E il codice HTML:

<input type="text" ng-model="myModel" my-directive> 

tuo direttiva può esporre un controller implementando nell'oggetto che il vostro funzione ritorna direttiva, come questo:

myApp.directive('myDirective1', function() { 
    return { 
     link: function($scope, elem, attrs) { 

     }, 
     controller: function() { 
      this.sayHello = function() { 
       alert("hello!"); 
      } 
     } 
    } 
}); 

myApp.directive('myDirective2', function() { 
    return { 
     require: 'myDirective1', 
     link: function($scope, elem, attrs, myDirective1Ctrl) { 
      myDirective1Ctrl.sayHello(); 
     } 
    } 
}); 

E il codice HTML:

<input type="text" my-directive2 my-directive1> 

È possibile anche richiedere un controller direttiva da una direttiva genitore scrivendo require: '^myParentDirective', in questo modo:

myApp.directive('myDirective1', function() { 
    return { 
     link: function($scope, elem, attrs) { 

     }, 
     controller: function() { 
      this.sayHello = function() { 
       alert("hello!"); 
      } 
     } 
    } 
}); 

myApp.directive('myDirective2', function() { 
    return { 
     require: '^myDirective1', 
     link: function($scope, elem, attrs, myDirective1Ctrl) { 
      myDirective1Ctrl.sayHello(); 
     } 
    } 
}); 

E il codice HTML:

<div my-directive1> 
    <div my-directive2></div> 
</div> 
+3

Grazie mille per l'ottima risposta! – Freewind

+18

Questo dimostra solo come f ... contorti è l'attuale documento angolare. Semplicemente non mi interessa. – honzajde

+0

@AndersEkdahl Hai detto che questo funziona per due direttive sullo stesso elemento, e anche per elementi figlio e genitore, ma funziona per elementi di pari livello? Ho visto esempi di ciò, ma non sono mai riuscito a farlo funzionare da solo. Ricevo sempre un errore della direttiva "così e così" che non ha "tale e tale" controllore. – Nocturno

Problemi correlati