Где я могу добавить и удалить прослушиватели событий в жизненном цикле контроллера Ember? - PullRequest
0 голосов
/ 16 октября 2018

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

В жизненном цикле компонента Ember много хуков и событий, но я не могу найти никакой документации о том, где можно прослушивать и не прослушивать события или обратные вызовы для конкретного маршрута.

Примером может быть Прослушивание координат GPS:

// Listen
this.set('watch', navigator.geolocation.watchPosition(navigator.geolocation.watchPosition(watchFn))

// Unlisten
navigator.geolocation.clearWatch(this.get('watch'))

(обратите внимание, что я хочу прослушивать маршрут / контроллер, а не компонент.)

Первая мысль - установить часы на __init(), но контроллер - одиночный, поэтому он будет срабатывать только один раз.

Вторая мысль - установить действия для activate()и deactivate() в маршруте. Они, похоже, не срабатывают (используя console.log тестовые операторы), поэтому я, вероятно, неправильно их использую. Обновление: Я случайно поместил их в actions.Они работают как крючки. Однако теперь я не могу запускать действия внутри контроллера, поскольку this.controller не существует, в отличие от didTransition(). Обновление: Чтобы получить доступ к контроллеру, нам нужно сделать this.controllerFor('route') † ¹.

Следующий кандидат - setupController() и resetController().resetController(), кажется, действительно работает надежно и срабатывает каждый раз, когда я покидаю маршрут.Но setupController() также, кажется, срабатывает только один раз.Что может иметь смысл, так как контроллер является синглтоном.Чтобы получить доступ к контроллеру, мы можем просто использовать первый аргумент (controller) † ².

Тогда я подумал, что мог бы использовать willTransition() или didTransition() вместо setupController().Они работают, как и ожидалось, для запуска слушателей при первой навигации по другому маршруту. Для доступа к контроллеру мы можем сделать this.controller † ³.

Но когда я ухожу к маршрутукоторый перенаправляет обратно на этот маршрут, хотя оба перехвата выполнены, похоже на resetController(), запускается после didTransition().Я не уверен, что так и происходит, но эффект тот же: слушатели перестают слушать, но не начинают слушать.Если я уйду по несвязанному маршруту и ​​вернусь обратно, слушатели снова будут активированы.

Я застрял в лабиринте возможностей.

  1. Как можно /Должен ли я достичь этого? (Я предполагаю, что это нормальный подход. Но если нет: у меня нет времени. Готовы сделать уродливые хаки в этот момент.)
  2. Есть ли лучшая практика и/ или «Угасающий путь» для достижения этого типа поведения on(x) off(x)?
  3. † ¹²³ - Какая риторика стоит за этими различными методами доступности контроллера?
...