Ich habe einige Probleme beim Erstellen eines Backbone.Model.save-Aufrufs. Der Web-Service, den ich anrufe, verbraucht URL-Parameter, aber was ich in Javascript habe, ist ein Objekt von geänderten Feldern. Zum Beispiel habe ich das Objekt {foo: 'bar', yar: 'har'}
, und ich möchte Backbone.Model.save eine Patch-Anforderung an eine URL schicken wie http://server/path/to/service?foo=bar&yar=har
Codierung von JSON zu URL-Parametern für Backbone.Model.save (Patch = True)
Klingt einfach, nicht wahr? Es gibt mir sowieso eine Menge Ärger. Hier ist, was ich bisher habe (was nicht funktioniert, ich Erfolg/Fehler Rückrufe haben, auch, aber ich glaube nicht, die für die Frage von Bedeutung sind):
object =
foo: 'bar',
yar: 'har'
model.save object,
patch: true
ich einige versucht haben, auch andere Optionen,:
model.save object,
patch: true
emulateJSON: true
Dieser Satz content auf "application/x-www-form-urlencoded", was gut ist, aber die Daten in der ajax-Anforderung von Backbone.sync gesendet wurde: {Modell: " {"foo": "bar", "yar": "har"} ". Der Service hat das und hat keine Ahnung, was man mit einer "Modell" -Eigenschaft machen soll.
model.save object,
patch: true
contentType: "application/x-www-form-urlencoded"
dies nur Codes object
als String und stopft, dass in options.data
. Auch hier weiß der Dienst nicht, was er damit machen soll.
Irgendwelche anderen Ideen, wie ich das erreichen kann, um meinem Service zu entsprechen? Ich kann den Ajax selbst anrufen und das Modell (und die Sammlung, zu der es gehört) selbst aktualisieren, aber das würde ich lieber nicht tun. Eine Ajax-Anforderung, die für mich funktioniert, ist:
$.ajax
url: "http://server/path/to/service"
type: "PATCH"
data: object
Update: Der Grund meine beiden früheren Optionen funktionierten nicht klar in Backbone.js selbst:
// 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} : {};
}
Blick auf diese, ich vielleicht dachte, wenn ich das Objekt in Objekt in options.data
gestopft und in leeren Attributen geschickt, vielleicht würde es funktionieren:
model.save {},
patch: true
data: object
Anscheinend versucht, PATCH eine Option "[Objekt Objekt]". Ich nehme an, es hat das Objekt gestrafft ... irgendwo ... aber das könnte nahe an der richtigen Antwort liegen?