3

バックボーン コレクションを使用して、サーバーから mongodb コレクションを取得しています。ID は「_id」として保存されるため、idAttribute を使用して「_id」にマップしました。

(function(){
  var PlaceModel = Backbone.Model.extend({
    idAttribute: "_id",
  });
  var PlaceCollection = Backbone.Collection.extend({
    url: "http://localhost:9090/places",
    initialize: function(options){
      var that = this;
      this.fetch({
        success: function(){
          console.log("Success!", that.toJSON());
        },
        error: function(){
          console.log("Error");
        }
      });
    }
  });

  var place = new PlaceCollection({model:PlaceModel});

}()); 

しかし、後でエントリを削除するときにモデルの「idAttribute」にアクセスしようとすると、「_id」ではなく「id」が返されます。これは、ビューからの this.model.isNew() がすべてに対して「true」を返すことを意味しますサーバーから取得したレコード。したがって、サーバーへのエントリを DELETE することも PUT することもできません。

ただし、(PlaceModel 定義内ではなく) 次のようなプロトタイプを使用して idAttribute を設定すると:

Backbone.Model.prototype.idAttribute = "_id";

次に、idAttribute を '_id' に正しくマップすると、すべてが機能します。何が起こっているのでしょうか?

4

1 に答える 1

7

あなたがこれを言うとき:

var place = new PlaceCollection({model:PlaceModel});

それは、多かれ少なかれ、次のように言っているのと同じです。

var o     = new Backbone.Model({ model: PlaceModel });
var place = new PlaceCollection([ o ]);

コレクションの「クラス」のmodelプロパティを設定しているのではなく、1 つのモデル ( ではなくプレーンなBackbone.ModelインスタンスPlaceModel) を含むコレクションを作成しているだけで、そのモデルにはmodelvalue の属性がありますPlaceModel

そのため、コレクションは、そのモデルが を持っていることになっていること、idAttribute: "_id"またはそのモデルが であることが想定されていることさえ認識していませんPlaceModel。を作成するときではなく、model作成するときにを表示したい場合:PlaceCollectionplace

var PlaceCollection = Backbone.Collection.extend({
  url: "http://localhost:9090/places",
  model: PlaceModel,
  //...
});

var place = new PlaceCollection;
于 2012-11-05T04:21:41.657 に答える