Подтвердить что ты не робот

Backbone.js Получение более сложных данных и использование в качестве коллекции

Предположим, что у меня такая настройка json:

{
  page:1,   
  items:[
    {  
      name: 'item1', 
      id:1
    }, 
    {
      name: 'item1', 
      id:2
    }, 
    {
      name: 'item1', 
      id:3
    }
  ] 
}

И такое моделирование:

var Item = Backbone.Model.extend({
    defaults: {name:  "No name"}
});

var ItemCollection = Backbone.Collection.extend({
    model: Item,
    url: '/some/ajax/url',
});

После выбора этого json, как я могу сопоставить элементы, установленные как коллекцию ItemCollection, и добавить номер страницы в качестве атрибута коллекции?

4b9b3361

Ответ 1

Как упоминалось в @asawyer, вам нужно переопределить метод parse, но вам не нужно фактически создавать экземпляр каждого элемента, Backbone может сделать это для вас, если вы вернете массив элементов.

Смотрите документацию для collection.parse

parse collection.parse(response)

parse вызывается Backbone всякий раз, когда модели коллекции возвращаются сервером, в выборке. Функция передается объект исходного ответа и должен возвращать массив атрибутов модели, которые будут добавлены в коллекцию.

Ваш код может быть записан как

var ItemCollection = Backbone.Collection.extend({
    model: Item,
    url: '/some/ajax/url',

    parse: function(data) {
        this.page=data.page;
        return data.items;
    }
});

Ответ 2

Вам нужно переопределить parse

В итоге это выглядит примерно так:

class Item extends Backbone.Model
    defaults:
        name: "No name"

class ItemCollection extends Backbone.Collection
    model: Item
    url: '/some/ajax/url'
    parse: (data) ->
        items = []
        _.each data, (item) ->
            newItem = new Item
                id: item.id
                name: item.name
            items.push newitem
        items

(Coffeescript, но достаточно легко конвертировать в прямой javascript)

Другим вариантом является реляционный плагин, найденный по адресу:

https://github.com/PaulUithol/Backbone-relational

Я никогда не использовал его, но я думаю, что он должен использовать материал для анализа разбора.