Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 模型:如何对嵌入式集合进行深层的JSON序列化?_Javascript_Backbone.js - Fatal编程技术网

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