我在Ember控制器生命周期的哪里添加和删除事件侦听器?

时间:2018-10-16 15:02:06

标签: javascript ember.js callback geolocation listener

如果我只想在特定路由上监听某些事件或回调 ,并在不在该路由上时停止监听。我将在哪里编写该代码?

在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测试语句),所以我可能错误地使用了它们。 更新:我不小心将它们放在{{1 }}。它们像钩子一样工作。 但是,现在我无法在控制器内触发动作,因为与actions相反,this.controller不存在。 更新:要访问控制器,我们需要做didTransition()†¹。

下一个候选者是setupController()resetController()this.controllerFor('route')似乎确实可靠地工作,并且每次我离开路线时都会触发。但是resetController()似乎也只能触发一次。这可能是有道理的,因为控制器是单例的。要访问控制器,我们只需使用第一个参数(setupController())†²。

然后我认为我可以使用willTransition()didTransition()代替controller。它们可以按预期工作,从而在首先导航到其他路线时启动监听器。要访问控制器,我们可以执行setupController()†³。

但是当我导航到一个重定向到该路由的路由时,尽管两个钩子都执行了,但它似乎在this.controller之后被触发了 resetController()。我不确定是否会发生这种情况,但是效果是一样的:侦听器停止侦听,但是他们没有开始侦听。如果我导航到不相关的路线并再次返回,则监听器将再次被激活。

我陷入了可能性的迷宫。

  1. 我如何/应该如何实现?(我认为这是一种正常的方法。但是,如果不是这样的话,我就没时间了。在这一点上愿意做些丑陋的事情。)
  2. 是否存在实现这种didTransition() on(x)行为的最佳实践和/或“ Ember方式”
  3. †¹²³-这些不同的控制器可访问性方法背后的言论是什么?

0 个答案:

没有答案