首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >backbone.js中的Automatic _.bindAll()

backbone.js中的Automatic _.bindAll()
EN

Stack Overflow用户
提问于 2012-07-17 05:48:06
回答 3查看 1.1K关注 0票数 2

有没有一种方法可以自动为backbone.js对象执行_.bindAll?

不久前我和一个人谈过,他们说有,但我不知道从哪里开始找。

示例:

代码语言:javascript
复制
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(){

    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-17 05:49:25

改为执行以下操作:

代码语言:javascript
复制
_.bindAll(this);

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

票数 5
EN

Stack Overflow用户

发布于 2013-01-07 01:57:17

从那以后,如果您想在视图中构建bindAll (对于AJAX回调方法等不像事件处理程序那样自动绑定的方法),我已经了解到了一种更简单的技术。基本上,您只需重写构造函数即可执行自动绑定。

代码语言:javascript
复制
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“部分,只需要:

代码语言:javascript
复制
    constructor: function() {
        Backbone.Model.apply(this, arguments);
        _(this).bindAll();
    }
票数 2
EN

Stack Overflow用户

发布于 2012-07-17 05:55:40

我试着自己做这件事,我能让它像这样工作:

代码语言:javascript
复制
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)我讨厌费力地处理冗长的堆栈跟踪

但是,如果您需要它,上面的代码应该可以工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11513066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档