我正在使用主干集合从服务器获取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'从服务器获取的记录。因此,我无法删除或将条目放入服务器。

但是,如果我使用这样的原型(而不是在PlaceModel定义内部)设置idAttribute:
Backbone.Model.prototype.idAttribute = "_id";

然后,它将idAttribute正确映射到'_id',并且一切正常。可能会发生什么?

最佳答案

当你这样说:

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

或多或少都这么说:
var o     = new Backbone.Model({ model: PlaceModel });
var place = new PlaceCollection([ o ]);

您不是在设置集合“类”的 model 属性,而是在其中创建一个具有一个模型的集合(一个普通的Backbone.Model实例,而不是PlaceModel),并且该模型具有model属性,其值为PlaceModel

因此,鉴于所有这些,该集合不知道其模型应该具有idAttribute: "_id",甚至不知道其模型应该具有PlaceModel。您想在创建model时看到PlaceCollection,而不是在创建place时看到:
var PlaceCollection = Backbone.Collection.extend({
  url: "http://localhost:9090/places",
  model: PlaceModel,
  //...
});

var place = new PlaceCollection;

09-18 06:31