如何设置Backbone Model.idAttribute?

Nil*_*ale 2 javascript php mongodb lithium backbone.js

我正在使用带骨干的MongoDb/Lithium php框架.

我希望我的所有模型ID和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) {
    },      
});
Run Code Online (Sandbox Code Playgroud)

这是视图代码,在模型上调用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'));
                    }
                });
Run Code Online (Sandbox Code Playgroud)

来自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
Run Code Online (Sandbox Code Playgroud)

编辑:以下工作...在模型类中注释id的条目后:

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

    initialize: function(props) {
    },
Run Code Online (Sandbox Code Playgroud)

jak*_*kee 5

来自Backbone 文档:

如果您直接与使用不同唯一键的后端(CouchDB,MongoDB)进行通信,则可以将Model的idAttribute设置为从该键透明地映射到id.

因此,idAttribute只需告诉您的Model类,任何具有相同键值的属性idAttribute也应该复制到id.在Backbone 源中,这可以通过以下方式完成:

if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
Run Code Online (Sandbox Code Playgroud)

基本上,如果您尝试设置具有相同名称的属性,则idaAttribute该值也会复制到id.

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