如何解决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));
}
当我第一次访问我的页面时,一切正常。
离开并重新访问页面后,我收到两次“日志: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()
,您还可以使用 RxJS fromEvent
来处理事件。在这种情况下,必须在 ngOnDestroy
钩子中关闭对它的订阅。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。