在backbone.js中自动_.bindAll()

时间:2012-07-16 21:48:06

标签: javascript backbone.js underscore.js

有没有办法为backbone.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(){

    }
}

3 个答案:

答案 0 :(得分:5)

请改为:

_.bindAll(this);

将在此视图中绑定所有函数。

答案 1 :(得分: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();
    }

答案 2 :(得分: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)它鼓励我限定bindAll,而不是仅仅使用1-arg表格 3)我讨厌涉及漫长的堆栈痕迹

但是,如果你想要它,上面的代码应该可行。