En JavaScript, ¿cuál es la mejor manera de eliminar una función agregada como detector de eventos mediante bind ()?
Ejemplo
(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", ___________);
};
})();
La única forma en que puedo pensar es hacer un seguimiento de cada oyente agregado con bind.
Ejemplo anterior con este método:
(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);
};
})();
¿Hay alguna forma mejor de hacer esto?
bindAll
función que simplifica los métodos de enlace. Dentro de su inicializador de objetos solo _.bindAll(this)
debe configurar cada método de su objeto en una versión enlazada. Como alternativa, si sólo desea enlazar algunos métodos (que recomiendo, para evitar fugas accidentales de memoria), se les puede proporcionar como argumentos: _.bindAll(this, "foo", "bar") // this.baz won't be bound
.
this.clickListener = this.clickListener.bind(this);
ythis.myButton.addEventListener("click", this.clickListener);