Parece haver algumas maneiras de se comunicar entre diretivas. Digamos que você tenha diretivas aninhadas, nas quais as diretivas internas devem comunicar algo ao externo (por exemplo, foram escolhidas pelo usuário).
<outer>
<inner></inner>
<inner></inner>
</outer>
Até agora eu tenho 5 maneiras de fazer isso
require:
diretiva pai
A inner
diretiva pode exigir a outer
diretiva, que pode expor algum método em seu controlador. Então, na inner
definição
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 no outer
controlador da diretiva:
controller: function($scope) {
this.chosen = function(something) {
}
}
$emit
evento
A inner
diretiva pode $emit
um evento ao qual a outer
diretiva possa responder, via $on
. Portanto, no inner
controlador da diretiva:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
e no outer
controlador de diretivas:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
Executar expressão no escopo pai, via &
O item pode vincular-se a uma expressão no escopo pai e executá-la em um ponto apropriado. O HTML seria como:
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
Portanto, o inner
controlador possui uma função 'innerChoose' que pode ser chamada
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
que chamaria (neste caso) a função 'functionOnOuter' no outer
escopo da diretiva:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Herança de escopo em escopo não isolado
Dado que estes são controladores aninhados, a herança do escopo pode estar em funcionamento, e a diretiva interna pode simplesmente chamar quaisquer funções na cadeia de escopo, desde que não tenha um escopo isolado). Então, na inner
diretiva:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
E na outer
diretiva:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Por serviço injetado no interior e no exterior
Um serviço pode ser injetado nas duas diretivas, para que eles possam ter acesso direto ao mesmo objeto ou chamar funções para notificar o serviço e talvez até se registrar para serem notificados em um sistema de publicação / publicação. Isso não requer que as diretivas sejam aninhadas.
Pergunta : Quais são os possíveis inconvenientes e vantagens de cada um em relação aos outros?