2012-10-18 12 views
5

mam szkielet modelu, który zawiera zbiór:Backbone.Models: Jak wykonać głęboką serializację JSON z wbudowanymi kolekcjami?

var Stream = Backbone.Model.extend({ 
    defaults: { 
     dummyField: "1", 
     excludedUsers: new Backbone.Collection() 
    } 
}); 

var s = new Stream; 
s.get('excludedUsers').add({name:'Stefan'}); 
console.log(s.toJSON()) 

Wynik:

{ dummyField: '1', 
    excludedUsers: 
    { length: 1, 
    models: [ [Object] ], 
    _byId: {}, 
    _byCid: { c1: [Object] } } } 

zamiast "oczekiwany":

{ 
     dummyField: '1', 
     excludedUsers: [ {name:'Stefan'} ] 
} 

ponieważ Kręgosłup nie jest głęboko JSONing Model. Jedynym sposobem obejścia jest prototyp override the toJSON method na prototypie Stream, ale to nie pomoże w innych przypadkach. Czy istnieje ogólne/lepsze rozwiązanie (oprócz ciężkiej wtyczki Backbone.Relational)?

Odpowiedz

0

może chcesz nadpisać funkcję Backbone.Collection.toJSON() bezpośrednio lub złożyć nowy zbiór, do którego rozciągają się na wszystkie inne kolekcje:

var MyDefaultCollection = Backbone.Collection.extend({ 
    toJSON: function() { 
     //Your code here 
    } 
}); 
var Stream = Backbone.Model.extend({ 
    defaults: { 
     dummyField: "1", 
     excludedUsers: new MyDefaultCollection() 
    } 
}); 
//You could also extend it 
var NewCollection = MyDefaultCollection.extend({ 
    //custom code here 
}); 

To tylko teoria, nigdy go zakodowane, więc wszelkie komentarze na mój pomysł jest mile widziany :)

0
function flattenModel(model) { 
    return _.mapValues(model.attributes, flatten); 
} 

function flattenCollection(collection) { 
    return collection.map(flattenModel); 
} 

function flatten(object) { 
    if (object instanceof Backbone.Model) { 
     return flattenModel(object); 
    } else if (object instanceof Backbone.Collection) { 
     return flattenCollection(object); 
    } 

    return object; 
} 

to zwróci przedmiot, a następnie:

JSON.stringify(flatten(model)) 

Zauważ, że _.mapValues to przydatna metoda od lodasha, więc powinieneś użyć tej metody lub po prostu ją przeportować.

Powiązane problemy