Извлечение данных из базовой модели в коллекцию

Я создал простой базовый проект, где он выбирает все детали книг и показывает их в пользовательском интерфейсе. Я забираю все детали книг из модели. не использовать коллекцию что-то вроде этого

var BookModel= Backbone.Model.extend({
    initialize: function(){
       this.fetchData();
    },

    fetchData: function(){
        this.url= "/get/all_books";

        this.fetch({
            success: success_callback,
            error: error_callback
        })
    }
});

Это работает нормально. Но почему я должен использовать коллекции? Если бы я использовал коллекцию, это было бы что-то вроде следующего

var BookModel= Backbone.Model.extend({
    defaults:{
        id:'',
        name: '',
        author: ''
    }
});


var BookCollection= Backbone.Collection.extend({
    model: BookModel,

    initialize: function(){
        this.fetchData();
    },

    fetchData: function(){
        this.url= "/get/all_books";

        this.fetch({
            success: success_callback,
            error: error_callback
        })
    }
});

Тот же эффект. Я не понимаю, зачем использовать Коллекции в моем случае. Пожалуйста, помогите мне понять эту концепцию на моем примере, почему я должен использовать коллекции здесь. Я много гуглил и мог найти лучший ответ.

Спасибо

2 ответа

Представьте, что у вас есть два маршрута:

/books
/books/:id

Теперь для получения конкретной книги вы можете отправить запрос на /book/:id маршрут, где :id это id книги.

GET /books/1
< { id: 1, title: 'On the Genealogy of Morality', ... } 

Что произойдет, если вы хотите получить все книги? Вы отправляете запрос на /books маршрут.

GET /books
< [{ id: 1, title: '...', ... }, { id: 2, title: '...', ... }, ...]

Магистраль следует тому же принципу. Модель для отдельной книги. Коллекция для многих книг. Когда вы используете коллекцию, Backbone создает одну модель для каждой книги. Использование модели для более чем одного элемента неправильно.

Вы сказали: "Backbone создает одну модель для каждой книги". на каком шаге это создает?

Это создает модели на sync событие, т.е. когда запрос на получение всех предметов завершен.

... как это помогает мне. В моем случае я всегда беру все книги, а не одну книгу.

Коллекции Backbone всегда используют Модели Backbone. Если вы не установите model собственность Collection явно, Backbone использует нормальную модель, то есть model свойство коллекции всегда должно ссылаться на модель.

// https://github.com/jashkenas/backbone/blob/master/backbone.js#L782

// Define the Collection's inheritable methods.
_.extend(Collection.prototype, Events, {

  // The default model for a collection is just a **Backbone.Model**.
  // This should be overridden in most cases.
  model: Model,

Рассматривайте модель как объект, а коллекцию как массив объектов.

Более всего, разделив ваши данные на логические единицы (модели) и сгруппировав их по категориям (коллекциям), вы сможете легко рассуждать, манипулировать и изменять свои данные. Как только вы создаете что-то, что даже немного сложнее, чем то, что вы создали, это становится приоритетом. Дело не в том, что вы получаете магическую функциональность, которую вы не могли бы получить иначе. Это все javascript в конце концов. Дело в том, что модели и коллекции обеспечивают структурирование данных, что полезно при создании динамических приложений. На самом деле в этом вся суть магистра и MV* в предоставлении полезных инструментов и абстракций. Коллекции - это решение целого ряда проблем, с которыми вы столкнетесь позже, когда добавите к своему приложению даже малейшую сложность.

Итак, вы спрашиваете, почему вы должны использовать коллекции, и я думаю, что ответ, который вы уже знали, заключается в том, что вам не нужно использовать коллекции. На самом деле, звучит так, будто вам вообще не нужно использовать библиотеку MV*.

Другие вопросы по тегам