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