【发布时间】:2017-10-04 11:29:14
【问题描述】:
简而言之:我想将 .bind 的结果绑定为它自己的调用中的参数
var bound = foo.bind(this,bound);
因为我不确定如何解决我的问题。
问题:
我有一个依赖于其他项目数组的项目。 删除其中一项后,我想删除依赖项,并删除放置在依赖项上的所有侦听器。
我正在努力删除其他依赖项的事件处理程序。我正在尝试使用绑定,但由于处理函数是删除侦听器的函数,我发现我必须将 bind() 调用的结果绑定到它自己的调用中作为参数。这当然行不通。
下面的绑定调用将 'handler' 的未绑定版本绑定为参数,因此 removeEventListener 不起作用,因为它是函数的不同副本。
问题是:我可以使用 bind 来执行此操作和/或如何解决此问题?
我使用的是eventemitter3,但对于任何事件库都应该是一样的。
setHandlers(dependentItem,dependencies)
{
var handler = this.onDependencyRemoved;
handler = handler.bind(this,dependentItem,dependencies,handler);//bind itself as third argument
dependencies.forEach(dependency => {
dependency.addEventListener("removed",handler);
});
}
onDependencyRemoved(dependentItem,dependencies,handler)
{
dependentItem.remove();
dependencies.forEach(dependency => {
dependency.removeEventListener("removed",handler);
});
}
编辑:
在 nodejs 中运行的完整工作示例:
const EventEmitter = require('events');
//const EventEmitter = require('eventemitter3');
class MyEmitter extends EventEmitter {
remove() {
console.log("I'm being removed, this should happen only once");
}
}
var dependent = new MyEmitter();
var dependencies = [new MyEmitter(),new MyEmitter()];
var handler = (e) => removeHandler(dependencies,dependent,handler);
dependencies.forEach(dependency => dependency.once('removed',handler));
var removeHandler = function(dependencies,dependent,handler) {
//remove the dependent object because one of the dependencies was removed
dependent.remove();
//remove the listeners from all of the dependencies
dependencies.forEach(dependency => {
console.log('before removing: '+dependency.listeners('removed').length);
dependency.removeListener('removed',handler);
console.log('after removing: '+dependency.listeners('removed').length);
});
}
//should remove the dependent object
dependencies[0].emit("removed");
//should not do anything anymore since the listeners are removed
dependencies[1].emit("removed");
【问题讨论】:
-
使用 event delegation 并在父元素上添加 一个 处理程序。
-
@Andreas 我在 node.js 中。这些项目是模型/ES6 类实例,而不是 DOM 项目。
标签: javascript node.js function event-handling