2012-05-24 121 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());