Если я хочу прослушивать определенные события или обратные вызовы только на определенном маршруте, и прекратить прослушивание, когда не на этом маршруте.Куда бы я написал этот код?
В жизненном цикле компонента 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()
.Я не уверен, что так и происходит, но эффект тот же: слушатели перестают слушать, но не начинают слушать.Если я уйду по несвязанному маршруту и вернусь обратно, слушатели снова будут активированы.
Я застрял в лабиринте возможностей.
- Как можно /Должен ли я достичь этого? (Я предполагаю, что это нормальный подход. Но если нет: у меня нет времени. Готовы сделать уродливые хаки в этот момент.)
- Есть ли лучшая практика и/ или «Угасающий путь» для достижения этого типа поведения
on(x)
off(x)
? - † ¹²³ - Какая риторика стоит за этими различными методами доступности контроллера?