2014-01-08 5 views
3

Этот plunkr выдает эту ошибку:Почему я не могу требовать директивы child от родительской директивы?

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

я могу работать вокруг этого, но мне интересно, если это по-дизайн, и почему (один из родителей против нескольких детей вещи)? Я не вижу упоминания об этом ограничении в $ng.compile docs.

ответ

5

Причина, по которой это не реализовано, - это производительность. Обход 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

Вы не можете требовать директивы ребенка, насколько я ничего не знаю в Angular. Вы можете только потребовать родительскую директиву от ребенка, по

require: '^parentDirectiveName' 

или директивами родственных, по

require: 'siblingDirectiveName' 

Так что да, это дизайн, или, по крайней мере, отсутствием функции.

Смежные вопросы