如何删除 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/