2

私はバックボーンでMongoDb/Lithiumphpフレームワークを使用しています。

すべてのモデルIDとidAttributeをデータベースドキュメントIDと同じにしたい(つまり、'_id' / mongoid)

質問:

  1. model.idAttributeの値を出力すると、_idとして表示されます。
  2. model.get('idAttriubte')を出力すると、未定義になります。
  3. idAttributeがデータベースid/mongoidと同じに設定されていることを確認するにはどうすればよいですか?

モデルクラスは次のとおりです。

window.app.IHoliday = Backbone.Model.extend({
    urlRoot: HOLIDAY_URL,
    idAttribute: '_id',
    id: '_id',
    // Default attributes for the holiday.
    defaults: {
    },

    initialize: function(props) {
    },      
});

モデルでfetchを呼び出すビューコードを次に示します。ドキュメントのモンゴイドは、非表示の入力(holiday_id)としてこのページに渡されます。

console.log('Holiday URL:' + HOLIDAY_URL );
        var Holiday = new window.app.IHoliday({ _id: holiday_id });
        console.log('HOLIDAY before fetch: \n' + JSON.stringify(Holiday));
        Holiday.fetch(
                {
                    success: function(){
                        //alert('Holiday fetched:' + JSON.stringify(Holiday));
                        console.log('HOLIDAY Fetched: \n' + JSON.stringify(Holiday));
                        console.log('Holiday name:' + Holiday.get('holiday_name'));
                        console.log('Holiday id:' + Holiday.id);
                        console.log('Holiday idAttribute:' + Holiday.idAttribute);
                        console.log('Holiday idAttribute:' + Holiday.get('idAttribute'));
                    }
                });

ファイアバグコンソールからの出力:

HOLIDAY before fetch:{"_id":"50bcaab24fbe3dfc1700000b"}
GET http://localhost:8080/li3/holidays/load/50bcaab24fbe3dfc1700000b 200 OK

HOLIDAY Fetched: 
{"_id":"50bcaab24fbe3dfc1700000b","holiday_name":"eeeeeeeeeeeeeeeee","description":"","star_rating":"3","holiday_type":"family","rooms":"1","adults":"2","child":"0","emails":""}

Holiday name:eeeeeeeeeeeeeeeee
Holiday id:50bcaab24fbe3dfc1700000b
Holiday idAttribute:_id
Holiday idAttribute:undefined

編集:モデルクラスのidのエントリをコメントアウトした後、次のように機能しました:

    window.app.IHoliday = Backbone.Model.extend({
    urlRoot: HOLIDAY_URL,
    //id: '_id',
    idAttribute: '_id',
    // Default attributes for the holiday.
    defaults: {
    },

    initialize: function(props) {
    },
4

2 に答える 2

5

バックボーンドキュメントから:

別の一意のキーを使用するバックエンド(CouchDB、MongoDB)と直接通信している場合は、モデルのidAttributeを設定して、そのキーからidに透過的にマップできます。

したがって、の値idAttributeと同じキーを持つ属性idAttributeもにコピーする必要があることをModelクラスに通知するだけidです。バックボーンソースでは、これは次のように実行されます。

if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];

基本的に、と同じ名前の属性を設定しようとするとidaAttribute、その値もにコピーされidます。

だからあなたの質問に答えるために:idAttributeを保存しませんidが、それはを保持する属性の名前を保存しますid

于 2012-12-03T13:55:53.197 に答える
3

idAttributeIDとして使用されるクラスのメンバーの名前が含まれます。したがって、を使用する場合idAttribute: '_id'、Backboneはメンバー_idをクラスのIDとして使用します。

holiday_idクラスのIDとして属性を使用する場合は、次のIHolidayことを試してください。

window.app.IHoliday = Backbone.Model.extend({
    urlRoot: HOLIDAY_URL,
    idAttribute: 'holiday_id',
    // Default attributes for the holiday.
    defaults: {
    },

    initialize: function(props) {
    },      
});

var Holiday = new window.app.IHoliday({holiday_id : holiday_id });

バックボーンはholiday_id、通常の属性の代わりに属性を使用しidます。

于 2012-12-03T13:53:49.660 に答える