【问题标题】:Backbone model.destroy with MongoDB persistence具有 MongoDB 持久性的主干 model.destroy
【发布时间】:2013-11-01 11:12:57
【问题描述】:

我是 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 函数?

【问题讨论】:

  • urlRoot: '/api/campaigns' 有效吗?当然要结合idAttribute: '_id'
  • 不完全...设置 idAttribute: 'id' 会中断 Backbone 集合的加载,但会尝试使用错误的参数发出 AJAX 删除请求(我真的需要 _id.$oid,如上所示)跨度>
  • 来自服务器的 JSON 看起来像 {_id: ..., $oid: ... } 吗?想必服务端想看DESTROY /api/campaigns/527303e82f3504ba5bf4b21f杀掉(服务端)模型吧?
  • 完全正确,我似乎无法将该 id (527303e82f3504ba5bf4b21f) 传递给 Backbone 的 destroy() 方法

标签: javascript mongodb backbone.js marionette


【解决方案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 作为模型的唯一标识符。

当您model.destroy() 时,简单的方法应该会为您提供DELETE /api/campaigns/527303e82f3504ba5bf4b21f 请求。

【讨论】:

  • 感谢您提供清晰详细的答案。 parse() 看起来像是要走的路……我试图避免覆盖 Backbone 函数,但在这种情况下,我认为它有理由清理对象。谢谢@mu
  • parse 的存在是有原因的,当您需要标准化传入数据时,没有理由避免实现自己的 parse
  • 现在实施...一旦我得到它滚动将发布为答案..再次感谢您的建议
  • 效果很好,我使用了 _.pick 的倒数并选择了 _.omit,但其他一切都一样。再次感谢
猜你喜欢
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多