angular - Ionic / Angular:在重新访问页面后多次调用EventListener
问题描述
在重新访问页面/视图后,我的 ionic/Angular 应用程序中的 EventListener 被多次调用。
代码:
export class xyPage implements OnInit {
constructor(
...
) {
document.addEventListener('xzy', this.listenerFunction.bind(this));
}
private listenerFunction() {
console.log('YAY');
this.doSomething(this.options, this.timer);
}
...
ionViewWillLeave() {
document.removeEventListener('xzy', this.listenerFunction.bind(this));
}
当我第一次访问我的页面时,一切正常。
离开并重新访问页面后,我得到了两次“log: YAY”。当我再次这样做时,我得到了三遍,依此类推......
此问题仅影响调用子函数并需要它的侦听器函数。
解决方案
每次访问都会创建一个新的事件侦听器,而之前的事件尚未被删除。使用 实现OnDestroy
挂钩并删除事件侦听器removeEventListener()
。当组件关闭/销毁时,这将删除现有的事件侦听器。
export class xyPage implements OnInit, OnDestroy {
constructor(
...
) {
document.addEventListener('xzy', this.listenerFunction.bind(this));
}
private listenerFunction() {
console.log('YAY');
this.doSomething(this.options, this.timer);
}
ngOnDestroy() {
document.removeEventListener('xzy', this.listenerFunction.bind(this));
}
...
}
也就是说,document
在 Angular 中绑定事件监听器并不优雅。它不会搜索特定组件,而是搜索完整的 SPA DOM。相反,您可以使用@ViewChild
模板引用变量并将侦听器绑定到组件的特定元素。除了 JS addEventListener()
,您还可以使用 RxJSfromEvent
来处理事件。仍然在这种情况下,对它的订阅必须在ngOnDestroy
钩子中关闭。
推荐阅读
- sql - 我想从 postgresql 数据库中获取部分数据作为 json 对象
- tortoisesvn - TortoiseSVN 更新后如何单步执行每个文件并解决冲突
- c++ - 使用 C++17 检测类成员是否存在
- javascript - PHP / Javascript 创建新输入取决于用户给出的值
- ruby-on-rails - Ruby on Rails 如何处理没有名称的 JSON 数组
- ruby - 将字符串对象转换为哈希对象
- python - 一种仅在训练集中使用带有增强数据的 sklearns RandomizedSearchCV 的方法
- python - 我有一个化学元素列表,但带有两个字母的元素也是分开的,我如何加入它们?
- r - 如何从 Shiny 模块调用中捕获所有错误?
- azure - 来自 TFSVC 代码的 AzureDevops Docker 映像没有这样的文件或目录