2013-01-18 16 views
5

Sto riscontrando qualche problema nel corretto funzionamento di una chiamata Backbone.Model.save. Il servizio Web che sto chiamando utilizza parametri URL, ma quello che ho in Javascript è un oggetto di campi modificati. Ad esempio, ho l'oggetto {foo: 'bar', yar: 'har'} e voglio Backbone.Model.save per inviare una richiesta di patch a un URL come http://server/path/to/service?foo=bar&yar=harCodifica JSON ai parametri URL per Backbone.Model.save (patch = true)

Suoni semplici, giusto? Comunque mi sta dando un sacco di problemi. Ecco quello che ho finora (che non funziona, non ho callback successo/errore, anche, ma non credo che quelli sono importanti per la domanda):

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

model.save object, 
    patch: true 

ho provato un po ' altre opzioni, anche:

model.save object, 
    patch: true 
    emulateJSON: true 

Questo set contentType a "/ x-www-form-urlencoded applicazione", che è buono, ma i dati inviati nella richiesta Ajax per Backbone.sync era: {modello: " {"foo": "bar", "yar": "har"} ". Il servizio ha capito e non ha idea di cosa fare con una proprietà "modello".

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

questo solo codici object come una stringa e animali che in options.data. Ancora una volta, il servizio non sa cosa fare con esso.

Qualche altra idea su come posso farlo conforme alle specifiche del mio servizio? Posso fare io stesso l'ajax e aggiornare il modello (e la collezione a cui appartiene), ma preferirei non farlo. Una richiesta Ajax che funziona per me è:

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

Update: Il motivo per i miei due opzioni precedenti non ha funzionato è chiaro in Backbone.js sé:

// 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} : {}; 
} 

Guardando a questo, mi pensato che forse se ho farcito l'oggetto in oggetto in options.data e mandato negli attributi vuoti, forse avrebbe funzionato:

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

a quanto pare questo ha cercato di PATCH un'opzione "[oggetto oggetto]". Immagino abbia fatto un stringify dell'oggetto ... da qualche parte ... ma questo potrebbe essere vicino alla risposta giusta?

risposta

2

Sembra che quello che stavo cercando è l'opzione processData su jQuery.ajax. Backbone.sync effettua le seguenti operazioni per impostazione predefinita:

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

Così, non è stato elaborando l'oggetto in parametri URL per me. (jQuery API)

Così, un po 'di lavoro di codice sarebbe:

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

In verità, non si stia utilizzando Backbone.Model correttamente nel complesso ... ma, almeno sta funzionando. : P