Backbone.js 为什么要使用下划线';s bindAll方法,而不是绑定到主干视图范围';什么方法?

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

大约一年后,我重新认识了我的老朋友。我对一些事情感到困惑。也就是说,视图的initialize使用下划线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行:

从阅读文档来看,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行与我上一个代码块中的行交换即可。确认它有效。