3

ネストされたリレーショナル バックボーン プロジェクトを作成しようとしていますが、本当に苦労しています。私がやろうとしていることの大まかなアイデアを以下に示しますが、Client で fetch() を呼び出すと、JSON として返される予約に基づいて多数の予約が自動的に作成されるという印象を受けました。

JSON の形式は、MVC のアウトラインの下に表示されます。

/****************************************************
/* CLIENT MODEL - Logically the top of the tree
/* has a BookingsCollection containing numerous Booking(s)                                                                             
/*  Client
/*      -Bookings               [BookingsCollection]
/*          -Booking            [Booking]
/*          -Booking            [Booking]
/*****************************************************/
var Client = Backbone.RelationalModel.extend({

    urlRoot: '/URL-THAT-RETURNS-JSON/',

    relations: [
        {
            type: Backbone.HasMany,
            key: 'Booking',
            relatedModel: 'Booking',
            collectionType: 'BookingsCollection'
        }
    ],

    parse: function (response) {

    },

    initialize: function (options) {
        console.log(this, 'Initialized');
    }

});


var Booking = Backbone.RelationalModel.extend({

    initialize: function (options) {
        console.log(this, 'Initialized');
    }

});

var BookingsCollection = Backbone.Collection.extend({

    model: Booking

});

返されるおおよその JSON

私が間違っていることを概説する助けがあれば、大歓迎です。

ありがとう

編集

時間を割いてフィードバックを投稿していただきありがとうございます。まさに私が望んでいたものです。

手動で属性を設定する努力をしなければ、JSON がモデルの実際の属性を物理的に定義するということですか? つまり、返される JSON が上記で示唆したとおりである場合、Backbone は単純に Client オブジェクト (id、title、firstname、surname の 4 つの属性を持つ) と 2 つの Booking オブジェクト (それぞれに 4 つの属性があり、おそらくBookingsCollection の各メンバー)?

この場合、各オブジェクトの属性を参照するための形式は何ですか? 非バックボーン リレーショナル ミニアプリをセットアップすると、たとえば Client.Attribute や Booking[0].EventDate を使用して属性を参照するだけで済む状況になりました。上記で概説した形式ではこれを行うことができないようです。

再度、感謝します。

4

1 に答える 1

3

返されるJSONは、BackboneまたはBackbone-Relationalがデフォルトで期待しているものではありません。

バックボーンとバックボーン-リレーショナルの期待は次のとおりです。

{
    "id": "123456",
    "Title":"Mr",
    "FirstName":"Joe",
    "Surname":"Bloggs",
    "Bookings": [
        {
            "id": "585462542",
            "EventName": "Bla",
            "Location":"Dee Bla",
            "EventDate":"November 1, 2012"
        },
        {
            "id": "585462543",
            "EventName": "Bla",
            "Location":"Dee Bla",
            "EventDate":"November 1, 2012"
        }
    ]
}

parse応答を使用するには、上記で投稿した構造を返す関数をクライアントモデルに作成する必要があります。

私の例のJSONで動作するモデル定義のjsFiddleの例:http: //jsfiddle.net/edwardmsmith/jVJHq/4/

その他の注意事項

  • バックボーンはID、フィールドがデフォルトで「id」という名前になることを想定しています。IDモデルのとして別のフィールドを使用するには、 Model.idAttributeを使用します
  • 予約コレクションの「キー」を「予約」に変更しました

サンプルコード:

Client = Backbone.RelationalModel.extend({

    urlRoot: '/URL-THAT-RETURNS-JSON/',

    relations: [
        {
            type: Backbone.HasMany,
            key: 'Bookings',
            relatedModel: 'Booking',
            collectionType: 'BookingsCollection'
        }
    ],

    parse: function (response) {

    },

    initialize: function (options) {
        console.log(this, 'Initialized');
    }

});


Booking = Backbone.RelationalModel.extend({

    initialize: function (options) {
    console.log(this, 'Initialized');
    }

});

BookingsCollection = Backbone.Collection.extend({

    model: Booking

});

myClient = new Client(    {
        "id": "123456",
        "Title":"Mr",
        "FirstName":"Joe",
        "Surname":"Bloggs",
        "Bookings": [
            {
                "id": "585462542",
                "EventName": "Bla",
                "Location":"Dee Bla",
                "EventDate":"November 1, 2012"
            },
            {
                "id": "585462543",
                "EventName": "Bla",
                "Location":"Dee Bla",
                "EventDate":"November 1, 2012"
            }
        ]
    });


console.log(myClient);​

ポストエディット

はい、JSONはモデルの属性をほぼ定義しています。parse()、、の組み合わせを使用して、 defaults有効validate()で許可される属性をより適切に制御できます。

バックボーンモデルのプロパティを読み取って設定する標準的な方法は、、、get()およびescape()関数をset()使用することです。

setvalidateこれは、関数(存在する場合)に対して属性と値を検証したり、ビューがリッスンするモデルの変更イベントをトリガーしたりするなど、一連のハウスキーピングを実行するため、特に重要です。

この回答の状況の特定のケースでは、あなたはかもしれません

myClient.get('Title');  // => "Mr"
myClient.get('Bookings'); //=> an instance of a BookingsCollection with 2 models.
myClient.get('Bookings').first().get('Location'); //=> "Dee Bla"
myClient.get('Bookings').last().get('Location');  //=> "Dee Bla"
myClient.get('Bookings').first().set({location:"Bora Bora"}); 
myClient.get('Bookings').first().get('Location'); //=> "Bora Bora"
myClient.get('Bookings').last().get('Location');  //=> "Dee Bla"
于 2012-07-03T19:41:34.087 に答える