總之:我想.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