Backbone model.destroy与MongoDB持久性

时间:2013-11-01 02:05:13

标签: javascript mongodb backbone.js marionette

我是Backbone和MongoDB的新手。我遇到了破坏模型的问题(由MongoDB支持)。我相信它与MongoDB“文档”使用异常_id属性并且默认情况下未与Backbone连接这一事实有关。我试过设置idAttribute: '_id'似乎无法解决问题。

示例Mongo文档如下所示:

{
  _id: Object
    $oid: "527303e82f3504ba5bf4b21f"
  __proto__: Object
  feeling: "ok"
  location: "california"
  name: "Kevin"
}

models.coffee

class Models.Campaign extends Backbone.Model
  urlRoot: "http://localhost:4567/api/campaigns"
  # setting idAttribute: '_id' causes issues rendering the Backbone collection

controller.coffee

...
model.destroy() #=> only removes the item from the dom but does not make a DELETE request

我可以将id传递给destroy()函数吗?

有没有人建议如何正确地将Backbone与MongoDB连接起来,而不必单击大量的内置Backbone功能?

1 个答案:

答案 0 :(得分:1)

如果您在模型中添加parse来整理从服务器获取的令人困惑的数据,我认为您将会更轻松。您不需要或不关心_id,您确实关心$oid,而Backbone更愿意使用id属性;您可以在模型中使用简单的parse来解决这三个问题:

parse: function(response) {
    var parsed = _(response).pick(
        'feeling',
        'location',
        'name'
    );
    parsed.id = response.$oid;
    return parsed;
}

演示:http://jsfiddle.net/ambiguous/pn773/

如果您的parse修改response而不是使用_.pick制作半版并修改该副本,则可能没问题,但parse不会技术上拥有response所以改变它是不礼貌的,可能会产生令人惊讶的副作用。好习惯等。

然后,当Backbone尝试将服务器的数据转换为模型时,它最终会使用:

{
  id: "527303e82f3504ba5bf4b21f",
  feeling: "ok",
  location: "california",
  name: "Kevin"
}

每个人都应该感到高兴:

  1. Backbone不会看到无关紧要的_id
  2. Backbone不会看到$oid,您无需将idAttribute设置为任何特殊内容。
  3. Backbone将看到它所期望的id,并且所有标准机器都将使用BSON ObjectId作为模型的唯一标识符。
  4. 这个简单的方法可以在DELETE /api/campaigns/527303e82f3504ba5bf4b21f时向您提出model.destroy()请求。