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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top