2012-04-04 6 views
13

Załóżmy mam takiego ustawienia json:backbone.js ściągam bardziej złożonych danych i wykorzystujące jako zbiór

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

a takiego modelowania:

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

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

po pobraniu tej json, w jaki sposób Czy mapuję elementy ustawione jako kolekcja ItemCollection i dodajesz numer strony jako atrybut do kolekcji?

Odpowiedz

26

Jak wspomniano o @asawyer, musisz zastąpić metodę parsowania, ale nie musisz faktycznie tworzyć instancji każdego elementu, Backbone może to zrobić dla ciebie, jeśli zwrócisz tablicę elementów.

Zobacz dokumentację collection.parse

parsecollection.parse(response)

parse jest wywoływana przez Backbone ilekroć modelką kolekcji są zwracane przez serwer, w sprowadzić. Funkcja jest przekazywana do surowego obiektu odpowiedzi, a powinna zwrócić tablicę atrybutów modelu, która ma zostać dodana do kolekcji w postaci.

Twój kod może być zapisany jako

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

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

Właśnie uratował mi godziny pracy. > _ < – asawyer

2

Trzeba zastąpić parse

Będzie w końcu wygląda mniej więcej tak:

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, ale dość łatwo przekonwertować do prostej JavaScript)

Twoja druga opcja jest relacyjna wtyczka znaleziona pod adresem:

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

Nigdy go nie używałem, ale powinno się to dla ciebie zrobić.

Powiązane problemy