4

次の RelationalModel モデルがあるとします。

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] }                 
    ]
}

単一の要求でデータをサーバーに送信/サーバーから読み取ることができるようにします。

ありがとう!

ティム

4

1 に答える 1

1

作成したばかりのこのフィドルにいくつかの小さな変更を加えて、例を使用して説明した JSON を生成することができましたExample

デバッガーに表示されていたいくつかの警告と、説明した結果を取得するために、これらの変更を行いました。お役に立てれば。

  1. サーバーの relatedModel と CollectionType がこれらのモデルを指しているため、データベース モデルとデータベース コレクションの宣言をサーバーの前に移動しました。
  2. relatedModel および collectionType では、String を使用する代わりに、Database および DatabaseCollection への参照を使用しました。
  3. ServerCollection というサーバーのコレクションを作成しました
  4. さらにいくつかの例を追加

最終的なコードは次のとおりです。2 つのコレクションを 1 つに結合する単純な古いバックボーン モデルを作成しました。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()); 
于 2014-03-31T14:00:09.467 に答える