2

backback.jsオブジェクトに対して_.bindAllを自動的に実行する方法はありますか?

少し前に誰かと話していたところ、あると言われましたが、どこから探し始めたらいいのかわかりません。

例:

var TheView = Backbone.View.extend({

    initialize: function() {
        // HOW CAN I AVOID HAVING TO DO THIS?---->
        _.bindAll(this,'render','on_element_01_click', 'on_element_02_click');
    },

    events: {
        'click #element_01': 'on_element_01_click',
        'click #element_02': 'on_element_02_click',
    },

    render: function(){
        return this;
    },

    on_element_01_click: function(){

    },

    on_element_02_click: function(){

    }
}
4

3 に答える 3

5

代わりにこれを行ってください:

_.bindAll(this);

このビューのすべての関数をバインドします。

于 2012-07-16T21:49:24.510 に答える
2

それ以来、ビューに組み込みたい場合は、より簡単な手法を学びましたbindAll(これは、イベントハンドラーのように自動バインドされないAJAXコールバックメソッドなどに便利です)。基本的には、コンストラクターをオーバーライドして自動バインドを実行するだけです。

var BoundModel = Backbone.Model.extend({
    constructor: function() {
        Backbone.Model.apply(this, arguments);
        if (this.boundMethods) {
            _(this).bindAll.apply(this, this.boundMethods);
        }
    }
})

var SubclassOfBoundModel = Backbone.Model.extend({
     boundMethods: ['handleFetchResponse'],
     initialize: function () {
         this.model.on('sync', this.handleFetchResponse);
     }
     handleFetchResponse: function() {
         // this function is bound to the model instance
     }
})

もちろん、すべてのメソッドをバインドしたいだけの場合は、「boundMethods」の部分を省略して、次のようにすることができます。

    constructor: function() {
        Backbone.Model.apply(this, arguments);
        _(this).bindAll();
    }
于 2013-01-06T17:57:17.440 に答える
1

私はこれを自分でやってみましたが、次のようなもので動作させることができました:

function bindOnExtend(clazz) {
    var originalExtend = clazz.extend;
    clazz.extend = function() {
        var newSubClass = originalExtend.apply(this, arguments);
        var originalInitialize = newSubClass.prototype.initialize;
        newSubClass.prototype.initialize = function() {
            // The constructor will get broken by bindAll; preserve it so _super keeps working
            var realConstructor = this.constructor;
            _.bindAll(this);
            this.constructor = realConstructor;
            originalInitialize.apply(this, arguments);
        };
        return bindOnExtend(newSubClass);
    };
    return clazz;
}

var BoundModel = Backbone.Model.extend();
bindOnExtend(BoundModel);

var BoundView = Backbone.View.extend();
bindOnExtend(BoundView);

しかし、私はそれをお勧めしません。そうすることで、すべての単一のモデル/ビュー/インスタンス化するものすべてのすべての単一のメソッドがクロージャになります。これにより、全体的なメモリ使用量がわずかに増加するだけでなく、注意しないとメモリリークが発生する可能性があります。さらに、bindOnExtendを経由する必要があるため、スタックトレースが数行長くなります。

私の経験では、「_.bindAll(this, ...」を実行する必要があるのは、次の理由で問題を起こす価値があります。

1)コードが私の後に来る人にとってより明確/明白になります2)bindAll1引数の形式を使用するだけでなく、自分のコードを修飾するように促します3)長いスタックトレースをくぐり抜けるのが嫌いです

ただし、必要に応じて、上記のコードが機能するはずです。

于 2012-07-16T21:55:39.947 に答える