骨干_.bind无法正常工作

时间:2012-11-07 19:15:29

标签: backbone.js underscore.js

在我的视图类初始化函数中,_.bind(this.appendSection, this)不起作用,但_.bindAll(this, 'appendSection')有效。我很困惑......

以下是代码:

TemplateBuilder.Views.TemplateView = Backbone.View.extend({
        el: $('div#evalTemplate'),

        initialize: function(){
            this.collection.on('reset', this.render, this);
            //_.bind(this.appendSection, this);
            _.bindAll(this, 'appendSection');                
        },

        events: {
            'click button#addSection': 'addSection'
        },

        render: function(){
            this.collection.each(this.appendSection);
            return this;
        },

        appendSection: function(section){                
            var view = new TemplateBuilder.Views.InstructionView({model: section});
            this.$el.append(view.render().el);
        },

        addSection: function(){
            var newSection = new TemplateBuilder.Models.Section();                
            this.collection.add(newSection);
            this.appendSection(newSection);
        },
    });  

1 个答案:

答案 0 :(得分:6)

来自fine manual

  

绑定 _.bind(function, object, [*arguments])

     

将一个函数绑定到一个对象,这意味着无论何时调用该函数, this 的值都将是对象。 [...]

var func = function(greeting){ return greeting + ': ' + this.name };
func = _.bind(func, {name : 'moe'}, 'hi');
func();
=> 'hi: moe'

不幸的是,手册不是那么精细,你必须看看示例代码隐含的内容:

func = _.bind(func, ...);

_.bind返回绑定函数,它不会就地修改它。你必须这样说:

this.appendSection = _.bind(this.appendSection, this);

如果您想使用_.bind。另一方面,_.bindAll绑定了适当的方法。有关这些方法的更多讨论over here