为什么使用下划线的bindAll方法而不是bind来限定骨干视图的方法?

时间:2014-03-19 15:16:10

标签: backbone.js underscore.js this underscore.js-templating

大约一年后,我重新认识了我的老朋友骨干。通过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中的特定线条吗?

1 个答案:

答案 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);
}