Mam pewne problemy poprawnie tworząc połączenie Backbone.Model.save. Usługa internetowa, którą wywołuję, pochłania parametry URL, ale to, co mam w JavaScript, jest obiektem zmienionych pól. Na przykład, mam obiekt {foo: 'bar', yar: 'har'}
i chcę, aby Backbone.Model.save wysłał żądanie poprawki do adresu URL takiego jak http://server/path/to/service?foo=bar&yar=har
Kodowanie parametrów JSON do URL dla Backbone.Model.save (patch = true)
Brzmi prosto, prawda? W każdym razie sprawia mi to kłopot. Oto co mam do tej pory (co nie działa, mam callbacków sukces/błędów, zbyt, ale nie sądzę, te są ważne dla kwestii):
object =
foo: 'bar',
yar: 'har'
model.save object,
patch: true
Próbowałem kilka inne opcje, TOO:
model.save object,
patch: true
emulateJSON: true
Ten zestaw contentType do "application/x-www-form-urlencoded", co jest dobre, ale dane przesyłane w ajax wniosek Backbone.sync było: {Model " {"foo": "bar", "yar": "har"} ". Usługa dostała to i nie ma pojęcia, co zrobić z właściwością "modelu".
model.save object,
patch: true
contentType: "application/x-www-form-urlencoded"
to tylko kody object
jako ciąg i spożywcze, które w options.data
. Ponownie usługa nie wie, co z nią zrobić.
Jakieś inne pomysły na to, w jaki sposób mogę uzyskać zgodność ze specyfikacją mojej usługi? Mogę sam wywołać ajax i zaktualizować model (i kolekcję, do której należy) sam, ale wolałbym tego nie robić. Żądania ajax, że pracuje dla mnie jest:
$.ajax
url: "http://server/path/to/service"
type: "PATCH"
data: object
Aktualizacja: Powodem moich dwóch wcześniejszych opcji nie działa jest jasne w backbone.js samego:
// 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} : {};
}
Patrząc na to, jak pomyślałem, że może gdybym nadziewane obiektu do obiektu w options.data
i wysłał w pustych atrybutów, chyba że to działa:
model.save {},
patch: true
data: object
Najwyraźniej próbował PATCH opcja "[obiekt obiektu]". Domyślam się, że to stringify obiektu ... gdzieś ... ale może być blisko właściwej odpowiedzi?