大约一年后,我重新认识了我的老朋友骨干。通过this tutorial工作,我对一些事情感到困惑。即视图的初始化使用下划线bindAll方法将“this”范围限定为render方法:
var CountryView = Backbone.View.extend({
tagName: 'option',
initialize: function(){
_.bindAll(this, 'render');
},
render: function(){
this.$el.attr('value', this.model.get('id')).html(this.model.get('name'));
return this;
}
});
这是一个与我合作的小事js小提琴。有问题的第13行:http://jsfiddle.net/wrGX5/1/
通过阅读文档,看起来_.bind和_.bindAll之间的唯一区别是bindAll将绑定到多个方法。如果是这样的话,为什么_.bind(这个''渲染')没有做同样的事情?这个小提琴的第13行:http://jsfiddle.net/4t3AX/1/ 除了它的范围内的方法数量之外,它的工作方式是否存在根本不同的东西?
附带问题:你能突出jsfiddle中的特定线条吗?
答案 0 :(得分:2)
这并不能完全回答您的问题,但由于您的示例已经使用了主干的事件功能,为什么要使用下划线?
简要说明:
"On"。将某些东西绑定到模型上的任何事件。你使用......
this.model.on("all", this.render, this);
" all"说要听每个模特活动。第三个参数用于传递上下文,并且是可选的。
绑定到" all"时,您调用的函数将事件名称作为第一个参数传递。一个例子是这样的:
render: function(eventType){
if(eventType === "change:name"){
this.$el.attr('value', this.model.get('id')).html(this.model.get('name'));
}
return this;
}
或者(可能更好)您可以使用"listenTo"。保持所有绑定与视图紧密相关。这在内存管理方面具有很多优势(拆除视图并且不会留下任何孤立的事件)。您的视图初始化看起来像:
initialize: function(){
this.listenTo(this.model, "all", this.render);
}