2013-12-18 72 views
1

我想使用save()將模型發送到REST服務,但我需要傳遞頭部參數以及json數據,以便調用正確的服務(spring可以使用標題將呼叫路由到正確的處理程序)。也就是說,我並沒有真正保存這個模型,我正在執行一個特定的操作(在這種情況下,這是一個批准操作)。 PUT url應該是這樣的:Backbone.js - 保存帶有頭部參數的模型

http://server/name/1 

而且這個不應該改變,因爲資源標識沒有改變。但是,標題應該包含一個包含動作的標題。在這種情況下,我們將調用參數'command',這個具體示例的命令值是'approve'。

我試着添加對象與數據字段保存:

model.save({data: {command:'approve'}}) 

但是,這只是增加了與數據的請求主體的JSON數據相關聯的對象。我已經讀過,這種方法在獲取方面可以作爲參數添加給定的數據,但保存似乎不符合我的期望。我單步穿過骨幹代碼,如果數據選項存在保存,它將與模型合併。

因爲我無法控制服務接口,所以我必須研究如何設置標頭參數。任何人都可以給我一些關於如何在保存模型的時候達到這個目的的指導?

回答

0

幾個小時後,我終於想出了一個工作解決方案。我開始與save命令:

model.save({command:'approve'}) 

然後我推翻骨幹的Ajax命令:

Backbone.ajax = function() { 
    var args = Array.prototype.slice.call(arguments, 0); 

    if (args[0].data) { 
     var model = JSON.parse(args[0].data); 
     var command = model.command; 
     if (command) { 
      args[0]['headers'] = { command: command}; 
     } 
    } 

    return Backbone.$.ajax.apply(Backbone.$, args); 
} 

此代碼查找該模型的指令值(Backbone.save把它放在那裏),並推動它的頭。下一步將是在返回之前從模型中簡單地刪除命令。

1

你可以通過幾種不同的方法解決這個問題。

您可以用您自己的實現覆蓋Backbone sync,如here所述。在您的同步實施中,您將取出某些參數(如approve),並將其阻塞到URL中。您可以覆蓋Model.url

+0

謝謝巴特。重寫骨幹同步並不是一個很好的解決這個難題的方法,因爲它需要被完全重寫以消除它當前不受歡迎的行爲,然後我會遇到保持我的版本與框架中的更新一致的問題。事實證明,查詢字符串是所有(IMO)之後的錯誤方法,因此重寫Model.url也無濟於事。 –