Eugene88
@Eugene88

AngularJS, как делегировать события из родительской директивы, директивам детей при изолированной области видимости у всех?

По сути заголовок вопроса уже объясняет суть проблемы.

Как делегировать события из родительской директивы, директивам детей при изолированной области видимости у всех?


Пример того, что пробовал доступен тут jsbin.com/nusoxad/5/edit?html,js,output

Коротко о задаче и проблеме.
Задача:
Компонент для страницы, на которой два подкомпонента со своей логикой. В случае если условие с логикой в компоненте страницы выполняется сразу, то передать событие подкомпонентам.

Проблема:
Подкомпоненты не видят события, если оно передаётся при загрузке родительского компонента, но видят, если оно передаётся по событию из родительского компонента. Например в родительском компоненте кнопка, где при клике делегируется событие детям.

В примере пробовал обернуть в $timeout вызов при загрузке родительского компонента, но в реальном приложении, даже это не сработало. Также пробовал, повесить директиву restrict: 'A' на кнопку, которая по условию при загрузке имитирует нажатие. В примере также работает, но в приложении, кнопка тоже директива и очень проблемно и некрасиво доставать элемент, на котором в действительности надо имитировать нажатие.
  • Вопрос задан
  • 359 просмотров
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
Никаких коммуникаций сверху вниз по дереву компонент через события (да и вверх тоже)
Это устаревший механизм.
Используйте новую нотацию component, односторонние байндинги и $onChanges в контроллере.
jsbin.com/yoxohemiji/1

Этот подход также готовит вас к Angular2.

Также это можно сделать через require контроллера parentDirective в childrenDirective, регистрации экземпляров-делегатов childrenDirective в некоем списке дочерних компонент в parentDirective. Тогда при наступлении определенных событий parentDirective будет дергать контроллеры этих делегатов и события не нужны.
Ответ написан
Почитайте о compile/link цикле.
Можно в postLink функции выполнить вашу логику и всё будет окей:
link: {
        post: function($scope, element, attrs) {
          $scope.$broadcast('SOME_EVENT_NAME');
        }
      }

Но вообще, если возникают такие потребности - то с архитектурой что-то не так.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы