如何删除Aurelia中的事件侦听器?

如何删除Aurelia中的事件侦听器?,aurelia,Aurelia,如何删除Aurelia中的事件侦听器 这似乎没有任何作用: detached(){ window.removeEventListener('scroll', this.windowScroll); } 当我改变路线时,事件仍在触发 我将其附加到视图模型文件中的构造函数(): window.addEventListener('scroll', this.windowScroll.bind(this)); 我还尝试了deactivate(),当我改变路线时,两个都没有触发。这里至少有一个问题

如何删除Aurelia中的事件侦听器

这似乎没有任何作用:

detached(){
  window.removeEventListener('scroll', this.windowScroll);
}
当我改变路线时,事件仍在触发

我将其附加到视图模型文件中的
构造函数()

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

我还尝试了
deactivate()
,当我改变路线时,两个都没有触发。

这里至少有一个问题,但可能有两个问题

设置事件侦听器 如果不能将Aurelia绑定用于事件委派(滚动可能是一种情况,也可能不是,我没有尝试过),那么应该使用附加的生命周期回调来设置事件处理程序,而不是构造函数。原因是,除非指定视图模型是瞬态的,否则构造函数将被调用一次。相反,您确实希望Aurelia在每次连接时都打开事件处理程序

attached = () => {
    window.addEventListener('scroll', this.onScroll);
}
如何编写生命周期回调 通常,您应该使用箭头符号编写生命周期回调。这是因为,IIRC,您的
This
可能会在激活生命周期中被重新分配。TypeScript/ES6中的箭头符号将在词汇上保留您的
这个
,也就是说,它是您所期望的

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);
}   

直接摘自这篇优秀文章:

bind
返回一个新函数。。。尝试将附加代码更改为
this.windowScroll=this.windowScroll.bind(this);window.addEventListener('scroll',this.windowScroll)然后
分离的
事件应该删除订阅这应该是答案。