主干-不管怎样,检查事件以前是否绑定过
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
绑定,从而在继续的过程中产生2x、4x、8x等次的重新渲染。
将绑定移动到initialize部分有点棘手(这应该可以解决这个问题),但是由于这不是一个选项,是否有其他可用的解决方案,比如让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);
//...
}
这真的是同样的逻辑,只是穿着不同的衣服。您也可以在render
中使用显式标志和if
,或者在initialize
中为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);
};
这对我来说效果很好。
相关文章:
- 主干-不管怎样,检查事件以前是否绑定过
- 在将绑定应用于控制器之后,是否会发出Angular$scope事件
- 是否可以为React'打开React.js自动绑定;s类模型
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 我是否可以使用 Angular 将鼠标向上事件绑定到文档正文
- jquery remove函数是否也删除了敲除绑定
- backbonejs是否使用“;现场绑定”;比如canjs
- 在Polymer中,双向绑定与属性表达式是否可能
- Backbone.js的Backbone.Modelbinding插件中是否有绑定的转换器参数
- 是否可以在extjs5中动态更新绑定
- Polymer v1.3.1数据绑定无论是否使用带有重复模板和json数组的iron ajax都无法工作
- 是否可以绑定javascript函数,使其本地上下文与“this”相同
- 如何检查挖空是否已完成数据绑定
- 确定 JavaScript 函数是否为绑定函数
- 方法是否绑定到在Javascript/Backbone.js中称为异步的事件
- 是否有用于浏览器中键盘绑定的开源库JS
- 谷歌机器人是否执行并遵循绑定到点击处理程序的 AJAX 请求
- 当 2 个或更多相同时,是否可以在 jQuery 中取消绑定特定的事件处理程序
- 更好的是:测试事件处理程序是否绑定或直接使用 .off()
- AngularJS:如何判断我的控制器是否绑定到我的ng-repeat指令元素?我的数据没有显示