使用backbone.js获取集合但未设置每个模型的id

时间:2013-11-12 09:40:01

标签: javascript backbone.js

简而言之,我正在获取一个集合,但之后我无法使用idcid从集合中获取特定实体。

对于此问题,请考虑我的两个REST端点/sites/sites/some-site-id/entities sitesentities都是集合。这是我的模特/收藏品:

模特/藏品

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字段)。

2 个答案:

答案 0 :(得分:1)

问题的根源是您的模型'id属性未设置。

只有在调用模型的id方法时,才会检查

idAttribute并将其设置为set

成功从集合中获取时,不会调用模型的set函数。因此模型idundefined

您需要在每个set模型中触发entity事件才能实现此目的。

答案 1 :(得分:0)

我发现我正在运行一个旧版本的backbone.js。其他人显然无法注意到,因为我没有将这些信息添加到问题中。

使用backbone.js 1.1.0和下划线1.4.4一切正常。