Pourquoi ne puis-je pas exiger une directive enfant d’une directive parent ?
-
20-12-2019 - |
Question
Ce plunkr renvoie cette erreur :
Error: [$compile:ctreq] Controller 'childDirective', required by directive 'parentDirective', can't be found!
Je peux contourner ce problème, mais je suis curieux de savoir si cela est inhérent à la conception et pourquoi (un parent seul ou plusieurs enfants) ?Je ne vois aucune mention de cette restriction dans le $ng.compile docs.
La solution
La raison pour laquelle cela n’est pas implémenté est la performance.Parcourir le DOM est beaucoup plus rapide que de vérifier chaque branche enfant pour une correspondance possible.Pour cette raison, la méthode recommandée consiste à laisser l'élément enfant informer son parent de son statut.
Notez que cela se fait via les instances de contrôleur associées, et non via les directives.
J'ai mis à jour votre plunk avec un exemple de travail
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);
}
};
});
Autres conseils
Vous ne pouvez pas exiger une directive enfant, pour autant que je sache, rien dans Angular ne le permet.Vous pouvez uniquement exiger une directive parentale d'un enfant, en
require: '^parentDirectiveName'
ou une directive fraternelle, par
require: 'siblingDirectiveName'
Alors oui, c'est intentionnel, ou du moins un manque de fonctionnalités.