2013-11-01 50 views
0

我是Backbone和MongoDB的新手。我遇到了摧毁模型(由MongoDB支持)的问题。我相信它与事实有关,MongoDB“文档”使用异常_id属性,并且默认情况下与Backbone没有连接。我试过设置idAttribute: '_id',这似乎不能解决问题。骨干model.destroy与MongoDB持久

样品蒙戈文档看起来像:

{ 
    _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()函数?

有没有人建议如何正确连接主干与MongoDB,而不必monkeypatch大量的内置Backbone功能?

+0

'urlRoot:'/ api/campaigns''工作吗?结合'idAttribute:'_id''当然。 –

+0

不完全...设置'idAttribute:'id''会中断Backbone集合的加载,但会尝试使用错误的参数进行AJAX删除请求(我真的需要'_id。$ oid',如上所示) – pruett

+0

JSON来自服务器看起来像'{_id:...,$ oid:...}'?据推测,服务器希望看到'DESTROY/api/campaigns/527303e82f3504ba5bf4b21f'杀死(服务器端)模型,对吧? –

回答

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,因此改变它会很粗鲁,并且可能会出现令人惊讶的副作用。良好的生活习惯等

然后,当骨干试图将服务器的数据转换成一个模型,它最终将与合作:

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

,每个人都应该感到高兴:

  1. 骨干赢得看不到无关的_id
  2. 骨干不会看到$oid,你不需要将idAttribute设置为任何特殊的东西。
  3. Backbone会看到一个id像它期望的那样,所有标准机器都将使用BSON ObjectId作为模型的唯一标识符。

简单的方法应该让你的DELETE /api/campaigns/527303e82f3504ba5bf4b21f请求,当你model.destroy()

+0

感谢您的明确答案。 'parse()'看起来像要走的路...我试图避免覆盖Backbone函数,但在这种情况下,我认为它是合理的,以便消毒对象。谢谢@mu – pruett

+0

'parse'存在是有原因的,当你需要标准化传入数据时,没有理由避免实现你自己的'parse'。 –

+0

现在执行...将尽快答复,当我得到它滚动..再次感谢您的建议 – pruett