总之:我想.bind的结果绑定在它自己的呼叫删除的事件处理程序
var bound = foo.bind(this,bound);
的arguement,因为我不知道怎么回事,解决我的问题。
问题:
我有依赖其他项目的阵列上的项目。 一旦这些项目之一被删除,我想删除依赖项,并删除所有依赖关系上放置的侦听器。
我努力去除其他依赖项的事件处理程序。我试图使用绑定,但由于处理函数是删除监听器的函数,我发现我必须将自己的调用中的bind()
调用的结果作为参数进行绑定。这当然不起作用。
绑定调用bellow将未绑定的'handler'版本作为参数绑定,因此removeEventListener不起作用,因为它是该函数的不同副本。
问题是:我可以使用绑定来做到这一点和/或我该如何解决这个问题?
即时通讯使用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");
使用[事件委托](https://stackoverflow.com/a/1688293/402037)并在父元素上添加_one_处理程序。 – Andreas
@Andreas我在node.js.这些项目是模型/ ES6类实例,而不是DOM项目。 – Flion