2012-04-04 13 views
13

Предположим, у меня есть такой параметр JSon:Backbone.js Fetching более сложных данных и с использованием в качестве коллекции

{ 
    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, и добавляю номер страницы в качестве атрибута коллекции?

ответ

26

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

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

разбореcollection.parse(response)

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

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

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

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

Вы только что спасли меня часов работы. > _ < – asawyer

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

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