如何删除Aurelia中的事件侦听器?
如何删除Aurelia中的事件侦听器 这似乎没有任何作用:如何删除Aurelia中的事件侦听器?,aurelia,Aurelia,如何删除Aurelia中的事件侦听器 这似乎没有任何作用: detached(){ window.removeEventListener('scroll', this.windowScroll); } 当我改变路线时,事件仍在触发 我将其附加到视图模型文件中的构造函数(): window.addEventListener('scroll', this.windowScroll.bind(this)); 我还尝试了deactivate(),当我改变路线时,两个都没有触发。这里至少有一个问题
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)代码>然后分离的
事件应该删除订阅这应该是答案。