2013-01-16 21 views
5

Właśnie zaczynam od Backbone i mam problem. Mam niezłą, spokojną konfigurację. W przypadku większości moich żądań GET otrzymuję pojedynczą kolekcję modeli, ale dla jednego ładuję zagnieżdżone dane relacyjne, które tworzą zagnieżdżone JSON.parsowanie zagnieżdżonych zbiorów json do kolekcji szkieletowych

W Backbone Mam następujący Models:

App.Models.Sequence = Backbone.Model.extend({}); 
App.Models.Layer = Backbone.Model.extend({}); 
App.Models.Item = Backbone.Model.extend({}); 

i te zbiory

App.Collections.Sequences = Backbone.Collection.extend({ 
    model: App.Models.Sequence, 
    url: '/api/sequences/' 
}); 

App.Collections.Layers = Backbone.Collection.extend({ 
    model: App.Models.Layer, 
    url: '/api/layers' 
}); 


App.Collections.Items = Backbone.Collection.extend({ 
    model: App.Models.Item, 
    url: '/api/items' 
}); 

załadować dane jako JSON:

[ 
       { 
       "id": "1", 
       "project_id": "8", 
       "name": "Seq1", 
       "layers": [ 
        { 
        "id": "1", 
        "name": "Layer11", 
        "sequence_id": "1", 
        "items": [ 
         { 
         "id": "1000000", 
         "layer_id": "1", 
         "itemtype_id": "1", 
         "position": "0" 
         }, 
         { 
         "id": "1000001", 
         "layer_id": "1", 
         "itemtype_id": "2", 
         "position": "0" 
         }, 
         { 
         "id": "1000002", 
         "layer_id": "1", 
         "itemtype_id": "2", 
         "position": "0" 
         }, 
         { 
         "id": "1000003", 
         "layer_id": "1", 
         "itemtype_id": "4", 
         "position": "0" 
         } 
        ] 
        }, 
        { 
        "id": "2", 
        "name": "Layer12", 
        "sequence_id": "1", 
        "items": [ 
         { 
         "id": "1000004", 
         "layer_id": "2", 
         "itemtype_id": "1", 
         "position": "0" 
         }, 
         { 
         "id": "1000005", 
         "layer_id": "2", 
         "itemtype_id": "2", 
         "position": "0" 
         }, 
         { 
         "id": "1000006", 
         "layer_id": "2", 
         "itemtype_id": "3", 
         "position": "0" 
         }, 
         { 
         "id": "1000007", 
         "layer_id": "2", 
         "itemtype_id": "4", 
         "position": "0" 
         } 
        ] 
        }, 
        { 
        "id": "3", 
        "name": "Layer13", 
        "sequence_id": "1", 
        "items": [ 
         { 
         "id": "1000008", 
         "layer_id": "3", 
         "itemtype_id": "1", 
         "position": "0" 
         }, 
         { 
         "id": "1000009", 
         "layer_id": "3", 
         "itemtype_id": "4", 
         "position": "0" 
         }, 
         { 
         "id": "1000010", 
         "layer_id": "3", 
         "itemtype_id": "5", 
         "position": "0" 
         } 
        ] 
        } 
       ] 
       }, 
       { 
       "id": "2", 
       "project_id": "8", 
       "name": "Seq2", 
       "layers": [ 
        { 
        "id": "4", 
        "name": "Layer21", 
        "sequence_id": "2", 
        "items": [] 
        }, 
        { 
        "id": "5", 
        "name": "Layer22", 
        "sequence_id": "2", 
        "items": [] 
        } 
       ] 
       }, 
       { 
       "id": "3", 
       "project_id": "8", 
       "name": "Seq3", 
       "layers": [ 
        { 
        "id": "6", 
        "name": "Layer31", 
        "sequence_id": "3", 
        "items": [] 
        }, 
        { 
        "id": "7", 
        "name": "Layer32", 
        "sequence_id": "3", 
        "items": [] 
        } 
       ] 
       } 
      ] 

Jak mogę uzyskać Sequences, Layers i Items w moich kolekcjach?

+0

Czy chcesz przeanalizować trzy oddzielne kolekcje, z których każda zawiera na przykład wszystkie elementy, na przykład "Warstwy" ze wszystkich sekwencji? Lub zagnieżdżonej strukturze modelu, gdzie każda 'Sekwencja' ma kolekcję podrzędną' Warstwy'? – jevakallio

+0

Potrzebuję trzech osobnych kolekcji. – lunacafu

Odpowiedz

8

Można użyć kombinacji podkreślenia na flatten i pluck to zrobić porządnie:

var data = { /* your JSON data */ }; 
var allSequences = _.clone(data); 
var allLayers = _.flatten(_.pluck(allSequences, 'layers')); 
var allItems = _.flatten(_.pluck(allLayers, 'items')); 

var sequences = new App.Collections.Sequences(allSequences); 
var layers = new App.Collections.Layers(allLayers); 
var items = new App.Collections.Items(allItems); 

Jeśli nie chcesz Sekwencje i warstw zawierają ich obiektów podrzędnych, aby je zastąpić Model.parse wykończenia. Na przykład:

App.Models.Sequence = Backbone.Model.extend({ 
    parse: function(attrs) { 
     delete attrs.layers; 
     return attrs; 
    } 
}); 

i zainicjować/dodać kolekcję z opcją parse:true:

var sequences = new App.Collections.Sequences(allSequences, {parse:true}); 

et cetera.