¿Por qué no puedo requerir una directiva infantil de una directiva de padres?
-
20-12-2019 - |
Pregunta
esta PLUNKR lanza este error:
Error: [$compile:ctreq] Controller 'childDirective', required by directive 'parentDirective', can't be found!
Puedo trabajar en esto, pero tengo curiosidad si esto es por diseño, y por qué (Padre soltero vs Multiple Children Thing)?No veo ninguna mención de esta restricción en la $ ng.compile docs .
Solución
La razón por la que esto no se implementa es el rendimiento.Atraverando el DOM es mucho más rápido que revisar la rama de cada niño para una posible coincidencia.Por esta razón, la forma recomendada es permitir que el elemento infantil informe a su padre de su estado.
Tenga en cuenta que esto se realiza a través de las instancias de controlador asociadas, no a través de las directivas.
He actualizado su implotis con una Ejemplo de trabajo
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);
}
};
});
Otros consejos
No puede requerir una directiva infantil, por lo que no sé nada en Angular lo permite esto.Solo puede requerir una directiva de padres de un niño, por
require: '^parentDirectiveName'
o una directiva de hermanos, por
require: 'siblingDirectiveName'
Entonces, sí, esto es por diseño, o al menos una falta de característica.