Ionic / Angular: EventListener 调用多次,重新访问页面后
Ionic / Angular: EventListener called multiple times, after re-visiting the page
我的 ionic/Angular 应用程序中的 EventListener 在重新访问 page/view 后被调用了多次。
代码:
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”。当我再次这样做时,我得到了 3 次,依此类推...
此问题仅影响调用子函数并需要此的侦听器函数。
每次访问都会创建一个新的事件侦听器,而之前的事件侦听器尚未被删除。实现 OnDestroy
挂钩并使用 removeEventListener()
删除事件侦听器。当组件为 closed/destroyed.
时,这将删除现有的事件侦听器
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
挂钩中关闭对它的订阅。
我的 ionic/Angular 应用程序中的 EventListener 在重新访问 page/view 后被调用了多次。
代码:
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”。当我再次这样做时,我得到了 3 次,依此类推...
此问题仅影响调用子函数并需要此的侦听器函数。
每次访问都会创建一个新的事件侦听器,而之前的事件侦听器尚未被删除。实现 OnDestroy
挂钩并使用 removeEventListener()
删除事件侦听器。当组件为 closed/destroyed.
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
挂钩中关闭对它的订阅。