提问人:Cirrocumulus 提问时间:9/23/2021 更新时间:9/23/2021 访问量:331
添加/删除 eventListeners,同时保持实例上下文为“this”
Add/remove eventListeners while keeping instance context of "this"
问:
我正在尝试使用vanilla JS事件系统,通过将事件调度到对象,在我的浏览器应用程序的不同组件(不涉及NodeJS)之间发送事件。window
// method in Class A
sendDone() {
window.dispatchEvent(new Event('done');
}
在另一个类中,我有一个方法来处理此事件的可选侦听器,用户可以启用/禁用该侦听器。
// method in Class B
setOption(shouldListen) {
if (shouldListen) {
window.addEventListener('done', this.doneHandler);
} else {
window.removeEventListener('done', this.doneHandler);
}
}
但是,处理程序获取上下文而不是实例上下文,并且关键字无法按我所希望的方式工作:window
this
// method in Class B
doneHandler() {
this.someMethod(this.someValue); // doesn't work
}
我无法使用匿名函数传递给处理程序,因为我无法从侦听器列表中删除匿名函数。出于同样的原因,我不能在函数定义中包含处理程序代码,如下所示:this
const self = this;
window.addEventListener('done', function() {
// can use self here instead
// but listener still can't be removed
});
我是 JS 的新手,我想知道通常如何处理这种情况。
谢谢。
答:
1赞
Danziger
9/23/2021
#1
您需要在类的构造函数中使用 Function.prototype.bind():
constructor() {
this.doneHandler = this.doneHandler.bind(this);
}
其余代码不会更改,因此现在可以添加和删除事件侦听器。
评论