1

私のビュークラス初期化関数では、機能_.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);
        },
    });  
4

1 に答える 1

6

細かいマニュアルから:

練る _.bind(function, object, [*arguments])

関数をオブジェクトにバインドします。つまり、関数が呼び出されるたびに、thisの値がobjectになります。[...]

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一方、メソッドを適切にバインドします。これらのメソッドについては、こちらでさらに議論されています。

于 2012-11-07T19:59:37.443 に答える