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=har
Codifica 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?