2013-11-01 51 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