如果我只想在特定路由上监听某些事件或回调 ,并在不在该路由上时停止监听。我将在哪里编写该代码?
在Ember组件生命周期中有很多挂钩和事件,但是我找不到关于在哪里侦听和取消收听特定于路由的事件或回调的文档。
一个例子是监听GPS坐标:
// Listen
this.set('watch', navigator.geolocation.watchPosition(navigator.geolocation.watchPosition(watchFn))
// Unlisten
navigator.geolocation.clearWatch(this.get('watch'))
(请注意,我想在路由/控制器上侦听,而不是组件上的侦听。)
首先想到的是将手表设置为__init()
,但是控制器为单例,因此只能触发一次。
第二个想法是为路线中的activate()
和deactivate()
设置动作。 它们似乎没有触发(使用 更新:我不小心将它们放在{{1 }}。它们像钩子一样工作。 console.log
测试语句),所以我可能错误地使用了它们。但是,现在我无法在控制器内触发动作,因为与 更新:要访问控制器,我们需要做actions
相反,this.controller
不存在。didTransition()
†¹。
下一个候选者是setupController()
和resetController()
。 this.controllerFor('route')
似乎确实可靠地工作,并且每次我离开路线时都会触发。但是resetController()
似乎也只能触发一次。这可能是有道理的,因为控制器是单例的。要访问控制器,我们只需使用第一个参数(setupController()
)†²。
然后我认为我可以使用willTransition()
或didTransition()
代替controller
。它们可以按预期工作,从而在首先导航到其他路线时启动监听器。要访问控制器,我们可以执行setupController()
†³。
但是当我导航到一个重定向到该路由的路由时,尽管两个钩子都执行了,但它似乎在this.controller
之后被触发了 resetController()
。我不确定是否会发生这种情况,但是效果是一样的:侦听器停止侦听,但是他们没有开始侦听。如果我导航到不相关的路线并再次返回,则监听器将再次被激活。
我陷入了可能性的迷宫。
didTransition()
on(x)
行为的最佳实践和/或“ Ember方式” ?