Backbone Collection覆盖添加

时间:2013-05-29 19:12:46

标签: javascript backbone.js

我创建了一个jsFiddle,显示了我在将一个模型添加到集合时所遇到的问题,然后迭代了该集合。发生的事情是我添加到集合中的第二个模型是覆盖我添加到集合中的第一个模型的值。

知道为什么会这样吗?

谢谢!

http://jsfiddle.net/C9wew/4734/

Event = Backbone.Model.extend({
    attributes: {},
    constructor: function (event) {
        this.set({
            eventType: event.eventType,
            timestamp: event.timestamp,
            sendingQuota: event.sendingQuota
        });
    }
});
Events = Backbone.Collection.extend({
    model: Event,
    initialize: function (models, options) {}
});

var collection = new Events();

var model1 = new Event({
    eventType: "videoStart",
    sendingQuota: 3,
    timestamp: +new Date()
});
collection.add(model1);

var model2 = new Event({
    eventType: "videoStart1234",
    sendingQuota: 100,
    timestamp: +new Date()
});
collection.add(model2);

collection.each(function (event, key, list) {
    console.log("key" + key);
    console.log(list[key].get("eventType"));
});

1 个答案:

答案 0 :(得分:2)

扩展Backbone.Model时,您将覆盖constructor,并使用在实例之间共享的对象覆盖attributes。因此,当您在一个实例中调用set时,它会写入该共享的attributes对象,所有实例都会从中读取。

原始Backbone.Model构造函数为每个实例(以及其他内容)实例化一个新的attributes对象。因此,除非您使用constructor,否则我建议您将该代码移至initialize,然后移除attributes对象。