Por que não posso exigir uma diretiva filho de uma diretiva pai?
-
20-12-2019 - |
Pergunta
Esse plunkr lança este erro:
Error: [$compile:ctreq] Controller 'childDirective', required by directive 'parentDirective', can't be found!
Posso contornar isso, mas estou curioso para saber se isso é intencional e por que (coisa de pai solteiro versus vários filhos)?Não vejo nenhuma menção a essa restrição no $ng.compile documentos.
Solução
A razão pela qual isso não é implementado é o desempenho.Percorrer o DOM é muito mais rápido do que verificar cada branch filho em busca de uma possível correspondência.Por esse motivo, a forma recomendada é permitir que o elemento filho informe seu pai sobre seu status.
Observe que isso é feito através das instâncias do controlador associadas, não através das diretivas.
Eu atualizei seu plunk com um exemplo de trabalho
angular.module('foo', [])
.directive('parentDirective', function() {
return {
controller: function($scope) {
$scope.childs = {};
this.registerChild = function(child) {
$scope.childs[child.name] = child;
};
},
link: function(scope, element, attrs) {}
};
})
.directive('childDirective', function() {
return {
controller: function($scope) {},
require: ['^parentDirective', 'childDirective'],
link: function($scope, $element, $attrs, $ctrls) {
var parent = $ctrls[0];
var child = $ctrls[1];
child.name = $attrs.childDirective;
parent.registerChild(child);
}
};
});
Outras dicas
Você não pode exigir uma diretiva filho, até onde sei, nada em Angular permite isso.Você só pode exigir uma diretiva pai de um filho, por
require: '^parentDirectiveName'
ou uma diretiva irmã, por
require: 'siblingDirectiveName'
Então, sim, isso ocorre intencionalmente ou, pelo menos, por falta de recurso.