添加到集合时修改模型的Backbone方法是什么?

时间:2014-01-06 21:31:54

标签: javascript sorting backbone.js collections

我的模型有一个index属性,默认为null,但在添加到集合时应由集合设置。这是我第一次想到的,但没有用。

var model = Backbone.Model.extend({
    defaults: {
        index: null,
        // ...
    },
    // ...
});

var collection = Backbone.Collection.extend({
    // ...
    add: function(model) {
        model.set({ index: this.size() });
        return model;
    },
    comparator: function(model) {
        return model.get('index');
    },
    // ...
});

然而,这不起作用。它会抛出错误TypeError: model.set is not a function。我有什么正确的方法或选项?

1 个答案:

答案 0 :(得分:3)

您不应该为此实际覆盖add方法。

The documentation states只要向其添加模型,就会在集合上触发add事件。你可以听这个事件并做你需要做的事。

event catalog中,您可以看到add事件处理程序将接收添加的模型作为第一个参数,因此您可以执行以下操作:

var collection = Backbone.Collection.extend({
    initialize: function() {
        this.on('add', function (model) {
            model.set({ index: this.size() });
        }, this);
    },
    //...
});

如果您还想在传递给构造函数的模型上运行它,请执行以下操作:

var collection = Backbone.Collection.extend({
    initialize: function(models) {
        _(models).each(function (model, i) {
            model.set({ index: i });
        });

        this.on('add', function (model) {
            model.set({ index: this.size() });
        }, this);
    }
});