2013-01-18 15 views
5

我在正確形成Backbone.Model.save調用時遇到了一些麻煩。我所調用的Web服務使用URL參數,但是我在Javascript中使用的是更改字段的對象。例如,我有對象{foo: 'bar', yar: 'har'},我希望Backbone.Model.save發送補丁請求到URL,如http://server/path/to/service?foo=bar&yar=har將JSON編碼爲Backbone.Model.save的URL參數(patch = true)

聽起來很簡單吧?無論如何,這給我帶來了一堆麻煩。這裏就是我這麼遠(這不工作,我有成功/錯誤回調也一樣,但我不認爲這些都是對這個問題很重要):

object = 
    foo: 'bar', 
    yar: 'har' 

model.save object, 
    patch: true 

我已經嘗試了一些其他選項,也:

model.save object, 
    patch: true 
    emulateJSON: true 

這組的contentType爲「application/X WWW的窗體-urlencoded」,這是很好的,但在由Backbone.sync Ajax請求發送的數據是:{模式:「 {「foo」:「bar」,「yar」:「har」}「。該服務得到了這一點,並不知道如何處理「模型」屬性。

model.save object, 
    patch: true 
    contentType: "application/x-www-form-urlencoded" 

這只是代碼object作爲一個字符串,配件是爲options.data。同樣,該服務不知道如何處理它。

關於如何使這符合我的服務規範的任何其他想法?我可以讓自己調用ajax並自己更新模型(以及它所屬的集合),但我真的寧願不這樣做。這對我的作品Ajax請求是:

$.ajax 
    url: "http://server/path/to/service" 
    type: "PATCH" 
    data: object 

更新:我的兩個前一選項沒有工作的原因是在Backbone.js的本身明確:

// Ensure that we have the appropriate request data. 
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { 
    params.contentType = 'application/json'; 
    params.data = JSON.stringify(options.attrs || model.toJSON(options)); 
} 

// For older servers, emulate JSON by encoding the request into an HTML-form. 
if (options.emulateJSON) { 
    params.contentType = 'application/x-www-form-urlencoded'; 
    params.data = params.data ? {model: params.data} : {}; 
} 

見到這種情景,我也許想如果我釀的對象爲對象爲options.data和空屬性發送的,也許它會工作:

model.save {}, 
    patch: true 
    data: object 

顯然,這嘗試修補一個選項「[object Object]」。我想它確實是對象的串化...在某處......但這可能接近正確答案?

回答

2

看起來我正在尋找的是processData選項jQuery.ajaxBackbone.sync默認執行以下操作:

// Don't process data on a non-GET request. 
if (params.type !== 'GET' && !options.emulateJSON) { 
    params.processData = false; 
} 

因此,它不處理對象爲URL參數我。 (jQuery API)

所以,代碼工作位將是:

model.save {}, 
    patch: true 
    data: object 
    processData: true 

說實話,我可能沒有使用正確Backbone.Model整體...但至少它的工作。 :P