如何删除 Aurelia 中的事件监听器?
How to remove event listeners in Aurelia?
如何在 Aurelia 中删除事件侦听器?
这似乎没有做任何事情:
detached(){
window.removeEventListener('scroll', this.windowScroll);
}
当我改变路线时,事件仍在触发。
我将其附加到我的视图模型文件的 constructor()
中:
window.addEventListener('scroll', this.windowScroll.bind(this));
我也试过 deactivate()
并且在我改变路线时都没有开火。
这里至少有一个,但可能有两个问题。
设置事件侦听器
如果您不能使用 Aurelia 绑定进行事件委托(滚动可能是也可能不是这种情况,我还没有尝试过),那么您应该使用附加的生命周期回调来设置您的事件处理程序,不是构造函数。原因是,除非您指定您的视图模型是瞬态的,否则构造函数将被调用 一次。相反,您真的希望 Aurelia 每次附加时都打开您的事件处理程序。
attached = () => {
window.addEventListener('scroll', this.onScroll);
}
如何编写生命周期回调
一般来说,您应该使用箭头表示法编写生命周期回调。这是因为,IIRC,您的 this
可能会在激活生命周期中被重新分配。 TypeScript/ES6 中的箭头符号将在词法上保留你的 this
,即,它是你所期望的。
detached = () => {
window.removeEventListener('scroll', this.onScroll);
}
值得注意的是,如果你想在分离时再次解除绑定,你需要在构造函数中定义你的可绑定函数:
export MyClass {
constructor() {
this.handleBodyClick = e => {
console.log(e.target);
};
}
attached() {
document.addEventListener('click', this.handleBodyClick);
}
detached() {
document.removeEventListener('click', this.handleBodyClick);
}
直接取自这个优秀的post:http://ilikekillnerds.com/2016/02/using-event-listeners-in-aurelia/
如何在 Aurelia 中删除事件侦听器?
这似乎没有做任何事情:
detached(){
window.removeEventListener('scroll', this.windowScroll);
}
当我改变路线时,事件仍在触发。
我将其附加到我的视图模型文件的 constructor()
中:
window.addEventListener('scroll', this.windowScroll.bind(this));
我也试过 deactivate()
并且在我改变路线时都没有开火。
这里至少有一个,但可能有两个问题。
设置事件侦听器
如果您不能使用 Aurelia 绑定进行事件委托(滚动可能是也可能不是这种情况,我还没有尝试过),那么您应该使用附加的生命周期回调来设置您的事件处理程序,不是构造函数。原因是,除非您指定您的视图模型是瞬态的,否则构造函数将被调用 一次。相反,您真的希望 Aurelia 每次附加时都打开您的事件处理程序。
attached = () => {
window.addEventListener('scroll', this.onScroll);
}
如何编写生命周期回调
一般来说,您应该使用箭头表示法编写生命周期回调。这是因为,IIRC,您的 this
可能会在激活生命周期中被重新分配。 TypeScript/ES6 中的箭头符号将在词法上保留你的 this
,即,它是你所期望的。
detached = () => {
window.removeEventListener('scroll', this.onScroll);
}
值得注意的是,如果你想在分离时再次解除绑定,你需要在构造函数中定义你的可绑定函数:
export MyClass {
constructor() {
this.handleBodyClick = e => {
console.log(e.target);
};
}
attached() {
document.addEventListener('click', this.handleBodyClick);
}
detached() {
document.removeEventListener('click', this.handleBodyClick);
}
直接取自这个优秀的post:http://ilikekillnerds.com/2016/02/using-event-listeners-in-aurelia/