更新记录时的Backbone Model和idAttribute

时间:2013-01-19 02:06:34

标签: javascript backbone.js

我正在使用mongoLab,模型ID看起来像这样

"_id": {
  "$oid": "50f9a0f5e4b007f27f766cf3"
},

我使用idAttribute将模型ID设置为_id,一切正常,直到我尝试更新模型。

由于模型中存在_id属性,因此在尝试插入时出现错误。

我是否需要从属性中删除属性_id?我假设Backbone的魔力会适当地清理属性

2 个答案:

答案 0 :(得分:2)

您需要删除_id属性。

在MongoLab REST API中,id不是数据有效负载本身的一部分,但并非所有后端都是如此。对于Backbone而言,假设id应该存在于有效载荷中,而不是假设它不应该存在,这可能更有意义。

据说没有真正的漂亮的方法让Backbone自动清除有效负载中的id。没有monkeypatching /重写太多代码的最佳选择可能是覆盖Model#toJSON,类似于:

Backbone.Model.prototype.toJSON = function (options) {
  var attrs = _.clone(this.attributes);
  // In this case you'd have to pass `includeId: true` to `toJSON` when you
  // actually *want* the _id in the output.
  return options && options.includeId ? attrs : _.omit(attrs, '_id');
};

您还可以使用monkeypatch同步,例如:

var sync = Backbone.sync;
Backbone.sync = function (method, model, options) {
  options || (options = {});
  // if options.attrs is present, Backbone will use it over dumping toJSON
  if (!options.attrs) options.attrs = _.omit(model.attributes, '_id');
  return sync.call(Backbone, method, model, options);
};

答案 1 :(得分:0)

有同样的问题,其中_id在javascript中被翻译为null .. 不得不做类似的事情。

 var myModel = Backbone.Model.extend({
   parse: function(response){
     var response = response.whatever;
     response.id = response.null;
     delete response.null;
     return appointment;
     }
  });

或收集

systems.forEach(function(system){
    console.log(system);
    system.id = system.null;
    delete system.null;
});