Em JavaScript, qual é a melhor maneira de remover uma função adicionada como ouvinte de eventos usando bind ()?
Exemplo
(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", ___________);
};
})();
A única maneira de pensar é acompanhar todos os ouvintes adicionados ao bind.
Exemplo acima com 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);
};
})();
Existem maneiras melhores de fazer isso?
bindAll
função que simplifica os métodos de ligação. Dentro do inicializador de objetos, você apenas faz _.bindAll(this)
para definir todos os métodos no seu objeto para uma versão vinculada. Alternativamente, se você só quer ligar alguns métodos (que eu recomendo, para evitar vazamentos de memória acidentais), você pode fornecê-los como argumentos: _.bindAll(this, "foo", "bar") // this.baz won't be bound
.
this.clickListener = this.clickListener.bind(this);
ethis.myButton.addEventListener("click", this.clickListener);