[英]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.