0

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

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

您可以从下面的控制台打印中看到该集合确实具有模型,并且这些模型具有 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,并会进行相应的解释。

我的想法错了吗/我这样做是否正确?

4

1 回答 1

6

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

ID: 1

JavaScript 区分大小写,因此idID不同的东西;idBackbone 在默认情况下正在寻找并且对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/

id或者你可以告诉你的模型使用不同的属性idAttribute

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/

于 2012-05-29T16:15:12.113 回答