有没有一种方法可以自动为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(){
}
}发布于 2012-07-17 05:49:25
改为执行以下操作:
_.bindAll(this);将绑定此视图中的所有函数。
发布于 2013-01-07 01:57:17
从那以后,如果您想在视图中构建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();
}发布于 2012-07-17 05:55:40
我试着自己做这件事,我能让它像这样工作:
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)我讨厌费力地处理冗长的堆栈跟踪
但是,如果您需要它,上面的代码应该可以工作。
https://stackoverflow.com/questions/11513066
复制相似问题