使用多个不同的模型类提供主干集合

时间:2016-11-16 17:07:45

标签: javascript backbone.js backbone-collections

我有几个模型都有自己可以获取的url / api。

我想将它们保存在一个系列中。

  • 这听起来像个好主意吗?
  • 你怎么去取他们? (我想只是为了获得我想要从集合中更新的模型然后获取它)

如果您有任何理论上的阅读/建议,请告诉我您的想法。

1 个答案:

答案 0 :(得分:3)

集合可以包含任何原始对象或从Backbone.Model派生的任何模型。只有当您有一个返回对象数组的API端点时,才能获取集合。

如果您想要获取特定型号,可以保留对其的引用,或仅在集合中get,然后在其上调用fetch

如果发生id碰撞,可能会导致问题,其中相同的ID被视为相同的模型并合并在一起。

var book = new Book({ id: 1, title: "My Book" }),
    note = new Note({ id: 1, title: "note test" });

var collection = new Backbone.Collection([book, note]);
console.log(collection.length); // 1

避免id碰撞的方法:

  • 如果可能,请不要对这些模型使用ID,Backbone将使用他们的cid
  • 使用GUIDs
  • 制作由标识数据组成的自定义id属性,例如在type属性前加上。 (book1note1)。

制作多模型集合的方法是使用model property作为函数。虽然默认情况下它不会阻止id碰撞。

var BooksAndNotes = Backbone.Collection.extend({

    /**
     * Different models based on the 'type' attribute.
     * @param {Object} attrs   currently added model data
     * @param {Object} options
     * @param {Backbone.Model} subclass dependant of the 'type' attribute.
     */
    model: function ModelFactory(attrs, options) {
        switch (attrs.type) {
            case "book":
                return new Book(attrs, options);
            case "note":
                return new MTextSession(attrs, options);
            default:
                return new Backbone.Model(attrs, options);
        }
    },
    // fixes this.model.prototype.idAttribute and avoids duplicates
    modelId: function(attrs) {
        return attrs.id;
    },
});

var collection = new BooksAndNotes([{
    title: "My Book",
    type: 'book'
}, {
    title: "note test",
    type: 'note'
}]);

查看有关集合中多个模型的类似问题:

相关问题