1

要するに、コレクションを取得していますが、その後、コレクションから特定のエンティティを取得できませidcid

この問題については、私の 2 つの 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フィールドの両方を持つ) で他の問題に遭遇することが想像できます。

4

2 に答える 2

1

問題の根本は、モデルのid属性が設定されていないことです。

ididAttributeモデルのsetメソッドが呼び出されたときにのみチェックされ、あなたに設定されます。

コレクションから正常にフェッチするsetと、モデルの関数への呼び出しはありません。モデルの場合も同様idですundefined

これを機能させるには、各モデルでsetイベントをトリガーする必要があります。entity

于 2013-11-12T10:16:04.257 に答える
0

古いバージョンの backbone.js を実行していることがわかりました。その情報を質問に追加しなかったため、明らかに他の人には気付かれませんでした。

backbone.js 1.1.0 とアンダースコア 1.4.4 では、すべて正常に動作します。

于 2013-11-12T11:13:29.413 に答える