首页 > 解决方案 > 在 Ember 控制器生命周期中,我在哪里添加和删除事件侦听器?

问题描述

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

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()ordidTransition()代替setupController(). 当首先导航到不同的路线时,它们按预期工作以启动侦听器。要访问控制器,我们可以做this.controller†³。

但是,当我导航到重定向回该路线的路线时,虽然两个钩子都执行了,但似乎 resetController()是在didTransition(). 我不确定这是否会发生,但效果是一样的:听众停止听,但他们没有开始听。如果我导航到不相关的路线并再次返回,侦听器将再次被激活。

我陷入了可能性的迷宫。

  1. 我如何/应该如何做到这一点?(我认为这是一种正常的方法。但如果不是:我没时间了。现在愿意做丑陋的黑客攻击。)
  2. 是否有最佳实践和/或“Ember 方式”来实现此类on(x) off(x)行为?
  3. †¹²³ - 这些不同的控制器可访问性方法背后的修辞是什么?

标签: javascriptember.jscallbackgeolocationlistener

解决方案


推荐阅读