我在我的一个观点中这样做:
render: function($options) {
...
this.collection.on('reset', _(function() {
this.render($options);
}).bind(this));
....
}
问题是,每当reset
以及重新渲染被触发时,都会创建一个新的reset
绑定,从而产生2x,4x,8x等次的重新渲染因为它继续。
将绑定移动到初始化部分(应该解决此问题)有点棘手,但是因为它不是一个选项,是否有其他可用的解决方案,比如让Backbone检查此事件是否已被绑定,或者什么?
答案 0 :(得分:2)
将绑定移至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);
//...
}
这真的是相同的逻辑,只是穿着不同的衣服。您还可以在if
中使用显式标记和render
,或在this._finish
中为initialize
分配一个函数,该函数将delete this._finish
。
答案 1 :(得分:1)
喜欢让Backbone检查此事件之前是否已绑定,或者是什么?
不确定..
!!this.collection._events["render"]
Backbone没有公开使其有用所需的大部分API。没问题,无论如何都要使用它。
答案 2 :(得分:0)
首先,将事件处理函数定义为命名函数
var self = this;
var onReset = function() {
self.render($options);
}
然后,每次渲染时防御性地取消绑定函数
this.collection.off('reset', onReset);
this.collection.on('reset', onReset);
答案 3 :(得分:0)
我最近使用javascript变量完成了这项工作。
在任何职能之外,我宣布:
var boundalready =0
然后,在函数内部:
if (boundalready == 0){
boundalready = 1;
bind(this);
};
这对我很有用。