javascript - 在 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()
. 我不确定这是否会发生,但效果是一样的:听众停止听,但他们没有开始听。如果我导航到不相关的路线并再次返回,侦听器将再次被激活。
我陷入了可能性的迷宫。
- 我如何/应该如何做到这一点?(我认为这是一种正常的方法。但如果不是:我没时间了。现在愿意做丑陋的黑客攻击。)
- 是否有最佳实践和/或“Ember 方式”来实现此类
on(x)
off(x)
行为? - †¹²³ - 这些不同的控制器可访问性方法背后的修辞是什么?
解决方案
推荐阅读
- asp.net - ASP.NET/VB.NET 错误消息说“'#ButtonName#' 未声明。由于它的保护级别,它可能无法访问。”
- c++ - 具有不同返回类型的 C++ 函数
- webpack - 如何在 sass 和 vue js 中使用 resolve-url-loader
- scala - Scala同时循环2个序列
- xml - 如何使用 vb.net 在 XML 中保存和读取特殊目录路径?
- windows - 批处理文件变量不打印
- kubernetes - 服务未在 Kubernetes 中公开
- docker - 启动时由 docker 绑定的端口,但不是正在运行的容器
- sql - Netezza 中的 REVERSE 功能不起作用,如果没有它,如何从路径中提取文件名?
- javascript - Angular 6 中延迟加载的功能可以使用 ngrx 在功能之间通信状态吗?