2

我正在使用带有主干的 MongoDb/Lithium php 框架。

我希望我的所有模型 id(s) 和 idAttribute(s) 与我的数据库文档 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。文档的 mongoid 作为隐藏输入 (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'));
                    }
                });

firebug 控制台的输出:

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,只需告诉您的 Model 类,任何与 's 值具有相同键的属性idAttribute也应复制到id. 在 Backbone源代码中,这是按如下方式完成的:

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

基本上,如果您尝试设置与 同名的属性idaAttribute,该值也会被复制到id.

所以要回答你的问题:idAttribute不存储id,但它存储包含属性的名称id

于 2012-12-03T13:55:53.197 回答
3

idAttribute包含将用作 id 的类成员的名称。因此,如果您使用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 });

Backbone 将使用该holiday_id属性而不是常规id属性。

于 2012-12-03T13:53:49.660 回答