使用页面加载数据引导Backbone Collection的正确方法

时间:2012-05-29 15:51:58

标签: javascript backbone.js

我在初始页面加载时在我的骨干应用程序中引导所有重要数据。这主要是收藏品。在我调用collection.get(id)的问题上,我已经被困了一段时间,但它返回undefined,即使我知道存在传递ID的ID属性的模型。

然后当我在控制台中检查集合时,我注意到应该包含模型ID数组的_byId数组是空的。

您可以从控制台打印出来,该集合确实有模型,这些模型具有ID属性。

window.campaigns
child
  _byCid: Object
  _byId: Object
    __proto__: Object
  _callbacks: Object
  length: 32
  models: Array[32]
  models: Array[32]
  0: child
    _callbacks: Object
    _escapedAttributes: Object
    _pending: Object
    _previousAttributes: Object
    _silent: Object
    attributes: Object
    DateCreated: "23/05/2012"
    DateScheduled: ""
    DateSent: ""
    Description: null
    From: null
    ID: 1
    IsAllowed: false
    Message: null
    Name: "Some name"
    __proto__: Object
    changed: Object
    cid: "c0"
    collection: child
    __proto__: ctor
  1: child
  2: child
  3: child
  4: child
  5: child
  length: 6
  __proto__: Array[0]
  __proto__: ctor

我使用JSON对象数组引导数据,这些对象在页面加载时写入我的索引页面。我认为这就是你所要做的全部,而Backbone会假设一个名为'ID'的属性是模型的ID,并会相应地解释。

我是否错误地认为这是正确的?

1 个答案:

答案 0 :(得分:6)

我在你的模型中看到了这一点:

ID: 1

JavaScript区分大小写,因此idID是不同的东西; Backbone默认情况下正在寻找id,并且对ID一无所知。

如果你使用id,那么一切都将开箱即用:

​var M = Backbone.Model.extend({});
var C = Backbone.Collection.extend({
    model: M
});
​var c = new C([
    { id: 1, str: 'where'    },
    { id: 2, str: 'is'       },
    { id: 3, str: 'pancakes' },
    { id: 4, str: 'house?'   }
]);

演示:http://jsfiddle.net/ambiguous/nzLEC/

或者您可以使用idAttribute告诉您的模型使用id的其他属性:

  

idAttribute model.idAttribute

     

模型的唯一标识符存储在id属性下。如果您直接与使用其他唯一键的后端(CouchDB,MongoDB)进行通信,则可以将模型idAttribute设置为从该键透明地映射到id

描述的第一句可能更好地表达为

  

模型的唯一标识符存储在id 属性下。

避免JavaScript对象属性与Backbone模型属性之间的一些常见混淆。

例如:

var M = Backbone.Model.extend({
    idAttribute: 'ID'
});
var C = Backbone.Collection.extend({
    model: M
});
var c = new C([
    { ID: 1, str: 'where'    },
    { ID: 2, str: 'is'       },
    { ID: 3, str: 'pancakes' },
    { ID: 4, str: 'house?'   }
]);

演示:http://jsfiddle.net/ambiguous/3NhGV/