简而言之,我正在获取一个集合,但之后我无法使用id
或cid
从集合中获取特定实体。
对于此问题,请考虑我的两个REST端点/sites
和/sites/some-site-id/entities
sites
和entities
都是集合。这是我的模特/收藏品:
模特/藏品
var ROOT = 'http://localhost:5000';
Entity = Backbone.Model.extend({
idAttribute: "_id",
defaults: {
xpos: 10,
ypos: 10,
site: "default"
}
});
Entities = Backbone.Collection.extend({
model: Entity,
ownUrl: '/entities',
site: {},
url: function() {
return ROOT + "/sites/" + (this.site? this.site : 'null') + this.ownUrl;
},
initialize: function(models, options) {
if(!options.site) throw new Error("No site associated with entities");
if(!options.site.get("_id")) throw new Error("Associated site has no _id");
this.site = options.site.get("_id");
}
});
Site = Backbone.Model.extend({
idAttribute: "_id",
defaults: {
name: "default",
description: "My site"
}
});
Sites = Backbone.Collection.extend({
model: Site,
url: ROOT + "/sites"
});
我的问题是,当我为网站提取实体时,我无法使用集合上的get
方法从集合中查找某个实体。我只是让undefined
返回。
这是我测试它的方式(entities.fetch将获得4个实体):
测试代码
var site1 = new Site({id : "52813a2888c84c9953000001"});
sites.add(site1);
site1.fetch({success: function(model, response, options) {
entities = new Entities([], {site: site1});
entities.fetch({success: function(model, response, options) {
entities.each(function (entity) {
console.log("entity.get(\"_id\") = " + entity.get("_id"));
console.log("entity.id = " + entity.id);
console.log("Looking up entity using id (" + entity.get("_id") + "): " + entities.get(entity.get("_id")));
console.log("Looking up entity using cid (" + entity.cid + "): " + entities.get(entity.cid));
console.log("");
});
}});
}});
当我跑步时,我得到:
测试结果
entity.id = undefined
entity.get("_id") = 528146ade34176b255000003
Looking up entity using id (528146ade34176b255000003): undefined
Looking up entity using cid (c1): undefined
entity.id = undefined
entity.get("_id") = 528146ade34176b255000002
Looking up entity using id (528146ade34176b255000002): undefined
Looking up entity using cid (c2): undefined
entity.id = undefined
entity.get("_id") = 528146ade34176b255000001
Looking up entity using id (528146ade34176b255000001): undefined
Looking up entity using cid (c3): undefined
entity.id = undefined
entity.get("_id") = 528146ade34176b255000004
Looking up entity using id (528146ade34176b255000004): undefined
Looking up entity using cid (c4): undefined
我期望集合返回特定实体。它是否与我的特殊idAttribute“_id”有关(为了符合mongodb)?
修改
显然它似乎与我的idAttribute有关。因为如果我向返回的每个实体添加“id”字段,我可以使用其id查找实体。就像在服务器端那样:
function getEntitiesInSite(siteId, fun) {
db.siteentities.find({site: mongojs.ObjectId(siteId)}, function(err, entities) {
entities.forEach(function (entity) {
entity.id = entity._id;
});
fun(err, entities);
});
}
这不完全是我想要的,我可以想象将来会遇到ID不一致的问题(同时包含id
和_id
字段)。
答案 0 :(得分:1)
问题的根源是您的模型'id
属性未设置。
id
方法时,才会检查 idAttribute
并将其设置为set
。
成功从集合中获取时,不会调用模型的set
函数。因此模型id
为undefined
。
您需要在每个set
模型中触发entity
事件才能实现此目的。
答案 1 :(得分:0)
我发现我正在运行一个旧版本的backbone.js。其他人显然无法注意到,因为我没有将这些信息添加到问题中。
使用backbone.js 1.1.0和下划线1.4.4一切正常。