bindAll()似乎不适用于骨干View

时间:2014-03-03 22:54:18

标签: javascript backbone.js underscore.js backbone-events backbone-collections

我有View在集合上监听“添加”事件。当处理程序触发时,上下文是Collection,即使我使用_.bindAll()将其绑定到View。这是一个错误,还是我不明白这是如何工作的? jsfiddle

V = Backbone.View.extend({
    initialize: function (options) {
        this.collection.on('add', this.onAdd);
        _.bindAll(this, 'onAdd');
    },
    onAdd: function () { console.log(this); }
});
c = new Backbone.Collection();
v = new V({collection:c});
c.add(new Backbone.Model());

输出:

e.Collection {length: 1, models: Array[1], _byId: Object, _events: Object, on: function…}

2 个答案:

答案 0 :(得分:2)

在绑定到collection语句之前放置bindAll方法 这应该有效:

V = Backbone.View.extend({
initialize: function (options) {
    _.bindAll(this, 'onAdd');
    this.collection.on('add', this.onAdd);

},
onAdd: function () { console.log(this); }

});

<强>更新 通过在.on()方法中应用上下文,可以不使用_.bindAll方法

this.collection.on('add', this.onAdd, this);

答案 1 :(得分:0)

您的问题是,当您的呼叫this.collection.on('add', this.onAdd);首先将事件绑定到onAdd函数而没有上下文(此=触发时的集合)并且调用_.bindAll(this, 'onAdd');时不会覆盖它

尝试更改顺序:

    _.bindAll(this, 'onAdd');
    this.collection.on('add', this.onAdd);