[英]Backbone - Anyway to check if an event has been bound before?
我在我的一個觀點中這樣做:
render: function($options) {
...
this.collection.on('reset', _(function() {
this.render($options);
}).bind(this));
....
}
問題是,無論何時reset
以及重新渲染都被觸發,都會創建一個新的reset
綁定,從而導致重新渲染2次,4次,8次等等。
將綁定移動到初始化部分(這應該解決這個問題)有點棘手,但是因為它不是一個選項,是否有其他可用的解決方案,比如讓Backbone檢查此事件是否已被綁定,或者其他什么?
將綁定移動到initialize
是最好的,但假設你有充分的理由不這樣做,你可以設置一個標志:
initialize: function() {
var _this = this;
this._finish_initializing = _.once(function($options) {
_this.collection.on('reset', function() {
_this.render($options);
});
});
//...
},
render: function($options) {
this._finish_initializing($options);
//...
}
有很多不同的方法來實現標志, _.once
很好地隱藏了標志檢查。 您還可以在render
觸發事件,並且具有取消綁定自身的偵聽器:
initialize: function() {
var finish_initializing = function($options) {
/* your binding goes here ... */
this.off('render', finish_initializing);
};
this.on('render', finish_initializing, this);
},
render: function($options) {
this.trigger('render', $options);
//...
}
這真是一樣的邏輯,只是穿着不同的衣服。 您還可以在initialize
使用顯式標志和if
in render
或為this._finish
分配函數,該函數將delete this._finish
。
比如讓Backbone檢查此事件之前是否已被綁定,或者是什么?
當然..
!!this.collection._events["render"]
Backbone不會暴露使其有用所需的大部分API。 沒關系,無論如何都要使用它。
首先,將事件處理函數定義為命名函數
var self = this;
var onReset = function() {
self.render($options);
}
然后,每次調用渲染時防御性地取消綁定該函數
this.collection.off('reset', onReset);
this.collection.on('reset', onReset);
我最近使用javascript變量完成了這個。
在任何函數之外,我聲明:
var boundalready =0
然后,在函數內部:
if (boundalready == 0){
boundalready = 1;
bind(this);
};
這對我很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.