Trong JavaScript, cách tốt nhất để loại bỏ một hàm được thêm vào như một trình lắng nghe sự kiện bằng cách sử dụng bind () là gì?
Thí dụ
(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", ___________);
};
})();
Cách duy nhất tôi có thể nghĩ đến là theo dõi mọi người nghe được thêm vào với ràng buộc.
Ví dụ trên với phương pháp này:
(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);
};
})();
Có cách nào tốt hơn để làm điều này?
bindAll
chức năng đơn giản hóa các phương thức ràng buộc. Bên trong trình khởi tạo đối tượng của bạn, bạn chỉ cần thực hiện _.bindAll(this)
để đặt mọi phương thức trong đối tượng của mình thành một phiên bản ràng buộc. Ngoài ra, nếu bạn chỉ muốn liên kết một số phương thức (mà tôi khuyên dùng, để ngăn chặn rò rỉ bộ nhớ ngẫu nhiên), bạn có thể cung cấp chúng dưới dạng đối số : _.bindAll(this, "foo", "bar") // this.baz won't be bound
.
this.clickListener = this.clickListener.bind(this);
vàthis.myButton.addEventListener("click", this.clickListener);