2013-01-18 4 views
5

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

Antwort

2

Es sieht aus wie das, was ich suchte, ist die processData Option zu jQuery.ajax. Backbone.sync hat standardmäßig folgende:

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

Somit ist es nicht das Objekt in URL-Parameter für mich Verarbeitung wurde. (jQuery API)

ein Arbeits Stück Code So wäre:

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

In Wahrheit kann ich nicht Backbone.Model Gesamt richtig verwenden werden ... aber zumindest funktioniert es. : P