2013-01-16 16 views
5

Sadece Backbone ile başlıyorum ve bir sorunla karşılaşıyorum. Çok dinlendirici bir kurulumum var. Benim GET isteğimin çoğu için tek bir model koleksiyonu aldım, ancak iç içe geçmiş ilişkisel verileri yüklüyorum, bu da yuvalanmış JSON'u oluşturur.yuvalanmış json omurga koleksiyonlarına ayrıştırılıyor

Backbone yılında

Ben Models vardır:

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

ve bu koleksiyonları

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' 
}); 

Ben JSON olarak verilerin yüklenmesi:

[ 
       { 
       "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": [] 
        } 
       ] 
       } 
      ] 

nasıl alabilirim Sequences, Layers ve Items koleksiyonlarımda?

+0

Üç ayrı koleksiyon ayrıştırmak istersiniz, bunların her biri örneğin, örneğin tüm '' Layer's '' Sekans 'ları gibi tüm varlıkları içerir. Ya da her "Sıra" nın bir 'Katman' alt koleksiyonuna sahip olduğu yuvalanmış bir model yapısı mı? – jevakallio

+0

Üç ayrı koleksiyona ihtiyacım var. – lunacafu

cevap

8

Sen düzgünce bunu alt çizgi en flatten ve pluck bir arada kullanabilirsiniz:

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); 

Eğer Diziler ve Katmanlar çocuklarının nesneler içermesi istemiyorsanız

, onları kırpmak için Model.parse geçersiz kılar. Örneğin:

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

Ve başlatmak/parse:true seçeneğiyle koleksiyonu ekleyin:

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

vesaire.

İlgili konular