Feed backbone collection with multiple different model classes

时间秒杀一切 提交于 2019-12-14 02:21:43

问题


I have several models which have their own url/api they can fetch.

I would like to keep them in a collection.

  • does it sound like a good idea?
  • how would you fetch them? (I'm thinking just to get the model I want to update from the collection then fetch it)

Let me know what you think, if you have any theoretical reading/advise.


回答1:


A collection can contain any raw objects or any models derived from a Backbone.Model. Fetching a collection makes sense only if you have an API endpoint which returns an array of objects.

If you want to fetch a specific model, you can keep a reference to it, or just get it inside your collection, and then call fetch on it.

It can cause problems when you have id collisions, where identical ids are considered the same model and are merged together.

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

Ways to avoid id collisions:

  • don't use ids for these models if possible, Backbone will use their cid.
  • use GUIDs.
  • make a custom id attribute composed of identifying data, like prepending the type attribute. (book1, note1).

A way to make a multi model collection is to use the model property as a function. Though it doesn't prevent id collision by default.

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'
}]);

See similar questions about multiple models in a collection:

  • A Backbone.js Collection of multiple Model subclasses
  • Backbone Collection with multiple models?


来源:https://stackoverflow.com/questions/40638121/feed-backbone-collection-with-multiple-different-model-classes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!