如何在Aurelia中删除事件监听器?

时间:2015-06-16 05:02:54

标签: aurelia

如何在Aurelia中删除事件监听器?

这似乎没有做任何事情:

detached(){
  window.removeEventListener('scroll', this.windowScroll);
}

当我更改路线时,事件仍在触发。

我将其附加到我的视图模型文件中的constructor()

window.addEventListener('scroll', this.windowScroll.bind(this));

我也试过deactivate(),当我改变路线时都没有开火。

2 个答案:

答案 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/