【发布时间】:2013-08-28 11:31:29
【问题描述】:
在 Backbone.js 中,我看到一个名为“cid”的属性...它仅用于模型对象(而不是视图或集合)
“id”和“idAttribute”是否也仅由模型对象使用?有什么区别? 如果你能用一个非常基本的例子来解释,那就太好了。
【问题讨论】:
在 Backbone.js 中,我看到一个名为“cid”的属性...它仅用于模型对象(而不是视图或集合)
“id”和“idAttribute”是否也仅由模型对象使用?有什么区别? 如果你能用一个非常基本的例子来解释,那就太好了。
【问题讨论】:
cid 是 Backbone 模型的一个属性,用作每个模型的唯一标识符,直到它们被分配一个真正的 id。在分配了模型id 或与idAttribute 匹配的属性后,不再使用cid。有关详细信息,请参阅backbone.js docs。 View 也有 cid,但这更多用于内部簿记和 jquery 事件绑定/取消绑定。
id 也是模型的特殊属性,它用于保存模型的后端标识符(大多数数据库为每个新条目/行创建某种标识符)。当这个标识符被标记为id 时,Backbone.js 可以开箱即用,但是有些数据库会以不同的方式标记它们的标识符(例如带有_id 的 MongoDB)。
在这些情况下,Backbone 不知道开箱即用地将该属性从属性移动到 id -property。这就是idAttribute 派上用场的地方:您可以将其定义为指向支持的标识符的标签(在 MongoDB 的情况下为 _id),然后 Backbone 知道将给定的 _id -attribute 分配给 @987654337 @属性。
例子:
var noIdModel = new Backbone.Model();
noIdModel.id // this will be undefined
noIdModel.cid // this will be something like c1
var idModel = new Backbone.Model({id: 1});
idModel.id // this will be 1
idModel.cid // this will be something like c2
// extend a model to have an idAttribute
var IdAttributeModel = Backbone.Model.extend({idAttribute: "_id"});
// create and instance of that model
// assign a value for an attribute with the same name as idAttribute
var idAttributeModel = new IdAttributeModel({_id: 1});
idAttributeModel.id // this will be 1
idAttributeModel.cid // this will be something like c3
真正把要点带回家:
每次调用 Backbone 模型的 set 时,它都会检查要设置的属性中是否存在 idAttribute,并将该属性的值设置为新的 id。这可以从this line of code in the Backbone.js source: 看到
if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
如您所见the default idAttribute is 'id'。设置您自己的idAttribute 将导致模型id 被相应地设置。
【讨论】:
来自backbone.js:
模型的一个特殊属性,cid 或客户端 id 是一个唯一的标识符,当它们第一次创建时自动分配给所有模型。当模型尚未保存到服务器并且还没有最终的真实 ID,但需要在 UI 中可见时,客户端 ID 很方便。
idAttribute 几乎相同,但不同之处在于它包含从现有后端获取的模型的 id。
【讨论】: