2013-07-16 3 views
0

У меня возникли проблемы с отправкой и ловом событий в Angular.Как поймать событие в контроллере, которое выбрано директивой в Angular?

Рассмотрим plunker: Plunk..

Как вы можете видеть, у меня есть два контроллера и директивы. Директива «живет» в контроллере 1. Когда что-то происходит в директиве, я хочу поймать это событие в контроллере 2. Как вы можете видеть на панели, на консоль ничего не записывается; событие не зацепилось.

Я также пытался воспользоваться услугой. В этом случае я создал метод в службе, и когда этот метод вызывается, я бросаю событие. Как и в Plunk, я слушаю событие в контроллере 2, но это также не сработало.

Где все это сводится к тому, что я хочу, чтобы вызвать метод на другой контроллер ..

ответ

1

Каждый раз, когда вы посещаете маршрут, связанный с контроллером (и $ сфера) являются (вос) созданы.

Поскольку вы упомянули, что контроллер 2 связан с маршрутом, он будет существовать только при посещении этого маршрута (как уже упоминалось @Ajay и @Stewie), поэтому вы не можете поймать событие в этом контроллере.

Я предлагаю вам создать сервис с некоторыми API/методы, чтобы сделать следующее:

  • запись о том, что событие вызвало
  • проверить, если событие вызвало
  • ясно событие

Ваша директива вызовет метод записи триггера. Ваш контроллер 2 вызовет метод проверки при его создании (а затем, вероятно, вызовет метод clear, если он найдет набор триггеров).

+0

Спасибо за ответ. Если вы правильно поняли, вы предлагаете создать $ watch на контроллере 2 на переменной/свойстве сервиса? – Martijn

+0

@Martijn, $ watch будет срабатывать только при обнаружении изменения (и при первом его инициализации). Это может сработать для вашего сценария, но это может и не так. Если событие уже запущено до создания контроллера 2, просто вызовите метод в службе как часть инициализации контроллера 2, чтобы определить, произошло ли событие. Если событие может произойти, когда контроллер 2 существует, используйте также часы $. –

+0

В моем сценарии я не думаю, что контроллер 2 существует, когда событие запускается. Поэтому вы предлагаете «просто вызвать метод в службе как часть инициализации контроллера 2, чтобы определить, произошло ли событие». Я не знаю точно, что вы подразумеваете под этим. Не могли бы вы объяснить это немного больше? – Martijn

2

В вас Plunker, второй контроллер (SecondController) зарегистрирован, но фактически никогда не инициализируется. Вот почему ваш слушатель никогда не регистрирует событие.

Непонятно, как, где и когда вы используете ваш второй контроллер, но если вы инициализируете его либо ng-view (через маршруты), либо ng-controller, то его слушатель будет наблюдать за событием.

PLUNKER

+0

Спасибо за ответ. У меня есть Контроллер 2, зарегистрированный на моих маршрутах (я не мог заставить плункер работать с маршрутами и шаблонами). Но все мои контроллеры настроены в маршрутах. В этом случае я просматриваю page1.html (с контроллером 1), который как директива 'foo'. Директива foo относится к foo.hmtl. Когда в foo.html что-то происходит, я хочу поднять событие, и я хочу поймать это событие в контроллере 2, который не отображается (/ загружен?) На данный момент, но зарегистрирован в маршрутах. – Martijn

+0

невозможно с помощью $ routeprovider config –

+0

@Ajaybeniwal Извините, я не понимаю, что вы имеете в виду. – Martijn

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