Почему мне не может потребовать дочерней директивы от родительской директивы?

StackOverflow https://stackoverflow.com//questions/21005911

  •  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'
.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top