2012-05-24 122 views
4

鉴于以下RelationalModel型号:序列化/反序列化嵌套骨干关系模型,以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] }     
    ] 
} 

这样dat可以在一个请求中发送/读取服务器中的一个。

谢谢!

回答

1

我是能够生产出您使用在本拨弄我刚刚创建Example一些小的改动你的例子所描述的JSON。

由于在调试器中显示的一些警告并获得了您描述的结果,我做出了这些更改。希望这可以帮助。

  1. 由于Servers relatedModel和CollectionType指向这些模型,所以将Database Model和DatabaseCollection的声明移至Server之前。
  2. 对于relatedModel和collectionType而不是使用字符串中使用的参考数据库和DatabaseCollection
  3. 创建了一个名为ServerCollection
  4. 增加了几个例子

这里是服务器的集合是你最终的代码,我只是创建了一个普通的旧Backbone模型,将两个集合合并为一个。调用toJSON可以让您将单个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());