将嵌套主干关系模型序列化/反序列化为 JSON



给定以下关系模型模型:

var Server = Backbone.RelationalModel.extend({
    relations: [{
        type: Backbone.HasMany,
        key: 'databases',
        relatedModel: 'Database',
        collectionType: 'DatabaseCollection',
        includeInJSON: 'id'
    }],
    defaults: {
        databases: []
    },
});
var Database = Backbone.RelationalModel.extend({});
var DatabaseCollection = Backbone.Collection.extend({
    model: Database
});

而这些对象:

new Database({
    id: 1,
    name: 'DB1'
});
new Database({
    id: 2,
    name: 'DB2'
});
var s1 = new Server({
    id: 3,
    name: 'S1',
    databases: [1,2]
});
将此

模型序列化/反序列化为支持此 JSON 结构的最简单/推荐的方法是什么?

{
    databases: [
        { id: 1, name: 'DB1' }
        { id: 2, name: 'DB2' }
    ],
    servers: [
        { id: 3, name: 'S1', databases: [1, 2] }                 
    ]
}

使得数据可以在单个请求中发送到服务器/从服务器读取。

谢谢!

提姆

我能够生成您使用示例描述的 JSON,并在我刚刚创建的这个小提琴中进行一些小改动示例。

由于调试器中显示的一些警告并得到您描述的结果,我进行了这些更改。希望这有帮助。

    将数据库模型和
  1. 数据库集合的声明移到服务器前面,因为服务器相关模型和集合类型指向这些模型。
  2. 对于相关模型和集合类型,而不是使用字符串,使用了对数据库和数据库集合的引用
  3. 为服务器创建了一个名为 ServerCollection 的集合
  4. 添加了更多示例

这是你最终得到的代码,我刚刚创建了一个普通的旧 Backbone 模型,将两个集合合并为一个。调用 JSON 会为您提供要传输到服务器的单个 JSON 对象。

var Database = Backbone.RelationalModel.extend({});
var DatabaseCollection = Backbone.Collection.extend({
    model: Database
});
var Server = Backbone.RelationalModel.extend({
    relations: [{
        type: Backbone.HasMany,
        key: 'databases',
        relatedModel: Database,
        collectionType: DatabaseCollection, 
        includeInJSON: 'id' 
    }],
    defaults: {
        databases: []
    } 
});
var ServerCollection = Backbone.Collection.extend({
    model: Server 
});
var allDatabases = new DatabaseCollection(); 
allDatabases.add([
    new Database({ id: 1, name: 'DB1' }),  
    new Database({ id: 2, name: 'DB2' }),
    new Database({ id: 3, name: 'DB3' }),
    new Database({ id: 4, name: 'DB4' })
]);   
var allServers = new ServerCollection(); 
allServers.add([
    new Server({
        id: 30,
        name: 'S1', 
        databases: [
          allDatabases.get(1),
          allDatabases.get(2)
        ]
    }),
    new Server({
        id: 40,
        name: 'S2',
        databases: [
          allDatabases.get(3),
          allDatabases.get(4)
        ]
    })
]);  
// combine into an object to transfer to server as one 
var serverObject = new Backbone.Model({
    'servers': allServers,
    'databases': allDatabases
});  
console.log(serverObject.toJSON()); 

相关内容

  • 没有找到相关文章

最新更新