有没有办法为backbone.js对象自动执行_.bindAll?
我刚才和别人说话,他们说有,但我不知道从哪里开始寻找。
示例:
var TheView = Backbone.View.extend({
initialize: function() {
// HOW CAN I AVOID HAVING TO DO THIS?---->
_.bindAll(this,'render','on_element_01_click', 'on_element_02_click');
},
events: {
'click #element_01': 'on_element_01_click',
'click #element_02': 'on_element_02_click',
},
render: function(){
return this;
},
on_element_01_click: function(){
},
on_element_02_click: function(){
}
}
答案 0 :(得分:5)
请改为:
_.bindAll(this);
将在此视图中绑定所有函数。
答案 1 :(得分:2)
如果你想在你的视图中构建bindAll
,那么我已经学会了一种更简单的技术(这对于像事件处理程序那样不自动绑定的AJAX回调方法很方便)。基本上你只需覆盖构造函数来执行自动绑定。
var BoundModel = Backbone.Model.extend({
constructor: function() {
Backbone.Model.apply(this, arguments);
if (this.boundMethods) {
_(this).bindAll.apply(this, this.boundMethods);
}
}
})
var SubclassOfBoundModel = Backbone.Model.extend({
boundMethods: ['handleFetchResponse'],
initialize: function () {
this.model.on('sync', this.handleFetchResponse);
}
handleFetchResponse: function() {
// this function is bound to the model instance
}
})
当然,如果您只想绑定所有方法,可以省略“boundMethods”部分,只需:
constructor: function() {
Backbone.Model.apply(this, arguments);
_(this).bindAll();
}
答案 2 :(得分:1)
我自己尝试过这样做,我能够使用这样的东西:
function bindOnExtend(clazz) {
var originalExtend = clazz.extend;
clazz.extend = function() {
var newSubClass = originalExtend.apply(this, arguments);
var originalInitialize = newSubClass.prototype.initialize;
newSubClass.prototype.initialize = function() {
// The constructor will get broken by bindAll; preserve it so _super keeps working
var realConstructor = this.constructor;
_.bindAll(this);
this.constructor = realConstructor;
originalInitialize.apply(this, arguments);
};
return bindOnExtend(newSubClass);
};
return clazz;
}
var BoundModel = Backbone.Model.extend();
bindOnExtend(BoundModel);
var BoundView = Backbone.View.extend();
bindOnExtend(BoundView);
但是,我不推荐它。这样做会对每个模型/视图/实例化的每个方法进行闭包。这不仅增加了整体内存使用量的轻微增加,而且如果你不小心的话,它也会打开内存泄漏的可能性。此外,它会使你的堆栈跟踪更长的几行,因为它们必须通过bindOnExtend。
根据我的经验,不得不做“_.bindAll(this, ...
”是值得的,因为:
1)它使我的代码更加清晰/明显对任何追随我的人
2)它鼓励我限定bindAll
,而不是仅仅使用1-arg表格
3)我讨厌涉及漫长的堆栈痕迹
但是,如果你想要它,上面的代码应该可行。