Sembrano esserci parecchi modi di comunicare tra le direttive. Supponi di avere delle direttive nidificate, in cui le direttive interne devono comunicare qualcosa all'esterno (ad esempio, è stata scelta dall'utente).
<outer>
<inner></inner>
<inner></inner>
</outer>
Finora ho 5 modi per farlo
require:
direttiva principale
La inner
direttiva può richiedere la outer
direttiva, che può esporre un metodo sul suo controller. Quindi nella inner
definizione
require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
// This can be passed to ng-click in the template
$scope.chosen = function() {
outerController.chosen(something);
}
}
E nel outer
controller della direttiva:
controller: function($scope) {
this.chosen = function(something) {
}
}
$emit
evento
La inner
direttiva può $emit
un evento, a cui la outer
direttiva può rispondere, tramite $on
. Quindi nel inner
controller della direttiva:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
e nel outer
responsabile delle direttive:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
Eseguire l'espressione nell'ambito genitore, tramite &
L'elemento può associarsi a un'espressione nell'ambito genitore ed eseguirlo in un punto appropriato. L'HTML sarebbe come:
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
Quindi il inner
controller ha una funzione 'innerChoose' che può chiamare
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
che chiamerebbe (in questo caso) la funzione 'functionOnOuter' nell'ambito della outer
direttiva:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Eredità dell'ambito su ambito non isolato
Dato che si tratta di controller nidificati, l'ereditarietà dell'ambito può essere al lavoro e la direttiva interna può semplicemente chiamare qualsiasi funzione nella catena dell'ambito, purché non abbia un ambito isolato). Quindi nella inner
direttiva:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
E nella outer
direttiva:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Per servizio iniettato sia all'interno che all'esterno
Un servizio può essere iniettato in entrambe le direttive, in modo che possano avere accesso diretto allo stesso oggetto o chiamare funzioni per notificare il servizio e magari registrarsi per ricevere una notifica in un pub / sottosistema. Ciò non richiede che le direttive siano nidificate.
Domanda : quali sono i potenziali svantaggi e vantaggi di ciascuno rispetto agli altri?