Jaki jest najlepszy sposób na usunięcie funkcji dodanej jako detektor zdarzeń za pomocą bind () w JavaScript?
Przykład
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.myButton.addEventListener("click", this.clickListener.bind(this));
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", ___________);
};
})();
Jedynym sposobem, jaki przychodzi mi do głowy, jest śledzenie każdego słuchacza dodanego za pomocą bind.
Powyższy przykład z tą metodą:
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.clickListenerBind = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListenerBind);
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", this.clickListenerBind);
};
})();
Czy są na to lepsze sposoby?
bindAll
funkcję, która upraszcza metody wiązania. Wewnątrz inicjalizatora obiektu po prostu _.bindAll(this)
ustawiasz każdą metodę w obiekcie na powiązaną wersję. Ewentualnie, jeśli tylko chcą wiązać pewne metody (co polecam, aby zapobiec przypadkowemu przecieki pamięci), można podać je jako argumenty _.bindAll(this, "foo", "bar") // this.baz won't be bound
.
this.clickListener = this.clickListener.bind(this);
ithis.myButton.addEventListener("click", this.clickListener);