2013-01-18 16 views
5

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=harKodowanie 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?

Odpowiedz

2

Wygląda na to, że szukałem opcji processData na jQuery.ajax. Backbone.sync robi co następuje domyślnie:

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

Zatem nie było przetwarzania obiektu do parametrów URL dla mnie. (jQuery API)

więc nieco roboczego kodu będzie:

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

W prawdzie, nie może być używany Backbone.Model poprawnie ogólnie ... ale przynajmniej to działa. : P