Javascript 主干-是否仍要检查事件以前是否已绑定?
我在我的一个观点中这样做:Javascript 主干-是否仍要检查事件以前是否已绑定?,javascript,backbone.js,Javascript,Backbone.js,我在我的一个观点中这样做: render: function($options) { ... this.collection.on('reset', _(function() { this.render($options); }).bind(this)); .... } 问题是,只要触发了reset以及重新渲染,就会创建一个新的reset绑定,从而在执行时产生2倍、4倍、8倍等的重新渲染次数 将绑定移到initialize部分(这应该可以解决
render: function($options) {
...
this.collection.on('reset', _(function() {
this.render($options);
}).bind(this));
....
}
问题是,只要触发了reset
以及重新渲染,就会创建一个新的reset
绑定,从而在执行时产生2倍、4倍、8倍等的重新渲染次数
将绑定移到initialize部分(这应该可以解决此问题)有点棘手,但是,由于它不是一个选项,是否还有其他解决方案可用,例如让主干检查此事件是否已绑定过,或者其他什么?首先,将事件处理程序函数定义为命名函数
var self = this;
var onReset = function() {
self.render($options);
}
然后,每次调用render时,都会以防御方式解除绑定该函数
this.collection.off('reset', onReset);
this.collection.on('reset', onReset);
将绑定移动到
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);
//...
}
有很多不同的方法来实现标志,只是很好地隐藏了标志检查。您还可以在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
,或在初始化中为分配一个函数。该函数将删除此项。_finish
我最近使用javascript变量完成了此操作
在任何函数之外,我声明:
var boundalready =0
然后,在函数内部:
if (boundalready == 0){
boundalready = 1;
bind(this);
};
这对我很有效
比如让主干网检查这个事件以前是否被绑定过,或者什么的
当然
!!this.collection._events["render"]
主干网不公开使其有用所需的大部分API。没关系,还是用吧