为什么我不能从父指令中要求子指令?

时间:2014-01-08 20:33:24

标签: angularjs angularjs-directive

plunkr会抛出此错误:

Error: [$compile:ctreq] Controller 'childDirective', required by directive 'parentDirective', can't be found!

我可以解决这个问题,但我很好奇这是否是按照设计,以及为什么(单亲与多个孩子的事情)?我在$ng.compile docs中没有看到任何提及此限制的内容。

2 个答案:

答案 0 :(得分:6)

未实现的原因是性能。遍历DOM比检查每个子分支以获得可能的匹配要快很多。因此,建议的方法是让子元素通知其父元素其状态。

请注意,这是通过关联的控制器实例完成的,而不是通过指令。

我已使用working example

更新了您的插件
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);
    }
  };
});

答案 1 :(得分:1)

你不能要求一个子指令,据我所知,Angular中没有任何内容允许这样做。您只能通过

要求孩子的父指令
require: '^parentDirectiveName'

或兄弟指令,

require: 'siblingDirectiveName'

所以是的,这是设计的,或者至少缺乏功能。