Почему мне не может потребовать дочерней директивы от родительской директивы?
-
20-12-2019 - |
Вопрос
Это plunkr бросает эту ошибку:
Error: [$compile:ctreq] Controller 'childDirective', required by directive 'parentDirective', can't be found!
Я могу работать вокруг этого, но мне любопытно, если это побочный дизайн, а почему (одинокий родитель против нескольких детей)?Я не вижу никаких упоминаний об этом ограничении в $ ng.compile docs .
Решение
Причина, по которой это не реализуется, является производительность.Проезжая до DOM намного быстрее, чем проверка каждой детской ветви для возможного совпадения.По этой причине рекомендуемый способ - позволить ребенку элемент сообщить своему родителю их статуса.
Обратите внимание, что это делается через связанные экземпляры контроллера, не через директивы.
Я обновил свой publeund с Рабочий пример
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);
}
};
});
. Другие советы
Вы не можете требовать дочерней директивы, насколько я ничего не знаю в угловом углу.Вы можете требовать только родительской директивы от ребенка, через
require: '^parentDirectiveName'
.
или директива брата, посредством
require: 'siblingDirectiveName'
.
Так да, это по дизайну или, по крайней мере, отсутствие функции.