Backbone.js 为什么要使用下划线';s bindAll方法,而不是绑定到主干视图范围';什么方法?
大约一年后,我重新认识了我的老朋友。我对一些事情感到困惑。也就是说,视图的initialize使用下划线bindAll方法将“this”范围限定到render方法:Backbone.js 为什么要使用下划线';s bindAll方法,而不是绑定到主干视图范围';什么方法?,backbone.js,underscore.js,this,underscore.js-templating,Backbone.js,Underscore.js,This,Underscore.js Templating,大约一年后,我重新认识了我的老朋友。我对一些事情感到困惑。也就是说,视图的initialize使用下划线bindAll方法将“this”范围限定到render方法: var CountryView = Backbone.View.extend({ tagName: 'option', initialize: function(){ _.bindAll(this, 'render'); }, render: function(){ t
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行:
从阅读文档来看,u.bind和u.bindAll之间的唯一区别是bindAll将绑定到多个方法。如果是这样的话,为什么u.bind(这个“render”)不做同样的事情呢?这把小提琴的第13行:
除了它将涉及的方法的数量之外,它的工作方式是否有本质上的不同
附带问题:您能突出显示JSFIDLE中的特定行吗 这并不能准确回答您的问题,但既然您的示例已经在使用主干的事件函数,为什么要使用下划线呢 简要概述: 。将某些内容绑定到模型上的任何事件。你会用
this.model.on("all", this.render, this);
“所有”都说要听每一个模型事件。第三个参数用于传递上下文,是可选的
当您绑定到“all”时,您调用的函数将作为第一个参数传递事件名称。例如:
render: function(eventType){
if(eventType === "change:name"){
this.$el.attr('value', this.model.get('id')).html(this.model.get('name'));
}
return this;
}
或者您可以使用。使所有绑定都与视图紧密绑定。这在内存管理方面有很多优势(分解视图,不留下任何孤立事件)。视图的初始化将类似于:
initialize: function(){
this.listenTo(this.model, "all", this.render);
}
简短回答:
.bind
返回绑定函数,.bindAll
可以将它们绑定到位。详情请参见副本的答案。这确实更容易理解。让我稍微转一转。只需将第二个小提琴中的第13行与我上一个代码块中的行交换即可。确认它有效。