Javascript 模型:如何对嵌入式集合进行深层的JSON序列化?
我有一个主干模型,其中包含一个集合:Javascript 模型:如何对嵌入式集合进行深层的JSON序列化?,javascript,backbone.js,Javascript,Backbone.js,我有一个主干模型,其中包含一个集合: 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())
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())
收益率:
{ dummyField: '1',
excludedUsers:
{ length: 1,
models: [ [Object] ],
_byId: {},
_byCid: { c1: [Object] } } }
而不是“预期”:
因为主干网并没有对模型进行深入的JS控制。解决这个问题的唯一方法是使用流的原型,但这对其他情况没有帮助。是否已经有了一个通用/更好的解决方案(除了重插件之外?您可能希望直接覆盖
主干.Collection.toJSON()
函数,或者创建一个新集合,扩展所有其他集合:
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
});
这只是理论,我从未编写过代码,所以欢迎对我的想法提出任何反馈:)
这将返回一个对象,然后:
JSON.stringify(flatten(model))
请注意,这是lodash提供的一个方便的方法,所以您应该使用该方法或仅移植该方法
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;
}
JSON.stringify(flatten(model))