2013-06-20 13 views
11

Ich habe eine grundlegende Anwendung mit Backbone.js, die nicht PUT Aufrufe (Update-Modell) macht. Vom Front-End, ich rufe eine Modelle save Funktion macht keinen PUT Anruf; Wenn ich es jedoch durch destroy ersetze, macht es einen DELETE-Aufruf an das Back-End. Jeder hat eine Idee, was könnte das Problem sein? Die Funktion, die keine PUT-Anforderung auslöst, ist die saveTask-Funktion.Backbone.js - model.save() feuert keine PUT Anfrage

+0

Welche Version von Backbone verwenden Sie? Ich hatte einige Probleme beim Aktualisieren eines Modells mit der Version 0.9.9. Es könnte sich um einen stillen Fehler beim Speichern oder einen Fehler in Ihrer Backbone-Version handeln. – mor

Antwort

18

Wenn Ihr Modell neu ist, wird es zu dem Zeitpunkt, zu dem Sie es speichern, eine Post-Methode auslösen. Wenn Ihr Modell jedoch nicht neu ist und Sie es aktualisieren, wird ein PUT ausgelöst.

Wenn dies nicht für Sie funktioniert, kann es daran liegen, dass Ihr Modell keine id -Eigenschaft hat, falls Sie eine ID mit einem anderen Namen verwenden, zum Beispiel taskID, dann müssen Sie in Ihrem Modell das IDAttribute setzen zu taskID so Backbone verwendet diese Eigenschaft als die Id und alles wird normal sein.

wie folgt aus:

var Task= Backbone.Model.extend({ 
    idAttribute: "taskId" 
}); 

hier ist der Link zu der Dokumentation auf Idattibute http://backbonejs.org/#Model-idAttribute

könnte auch ein anderes Problem, das sein {} in Ihrem speichern rufen nur versuchen,

this.model.save(); 

anstelle von

+0

Danke für die Antwort. Mein Modell hat eine ID-Eigenschaft, und ich habe 'idAttribute' gesetzt - um sicherzugehen, dass ich die ID des Modells ('this.model.id') überprüft habe, während ich versuche zu speichern. Es wird immer noch kein PUT ausgelöst - und 'model.destroy()' funktioniert einwandfrei.Fehle ich noch etwas? –

+0

Warum haben Sie die {} innerhalb des Speicheraufrufs? Ich denke, es sollte nur model.save() sein; ohne leeres Objektliteral als Parameter. –

+0

Danke - es ist ein Tippfehler (zuvor versucht, den Erfolg Rückruf zu verwenden), aber es scheint nicht verwandt zu sein (kein Unterschied). Das Modell wird korrekt geändert (Attribute werden aktualisiert), jedoch nicht auf dem Server gespeichert. –

2

Ich glaube Modell immer Optionen Parameter erwartet und wahrscheinlich auch die Rückrufe

this.model.save(null, { 
    success: function (model, response) { 

     // 
    }, 
    error: function() { 
     // 
    } 
}); 

Wenn Sie bei Backbone src betrachten, werden Sie das auch bemerken ...

======

// Set a hash of model attributes, and sync the model to the server. 
// If the server returns an attributes hash that differs, the model's 
// state will be `set` again. 
save: function (key, val, options) { 
    var attrs, method, xhr, attributes = this.attributes; 

    // Handle both `"key", value` and `{key: value}` -style arguments. 
    if (key == null || typeof key === 'object') { 
     attrs = key; 
     options = val; 
    } else { 
     (attrs = {})[key] = val; 
    } 

    options = _.extend({ 
     validate: true 
    }, options); 

    // If we're not waiting and attributes exist, save acts as 
    // `set(attr).save(null, opts)` with validation. Otherwise, check if 
    // the model will be valid when the attributes, if any, are set. 
    if (attrs && !options.wait) { 
     if (!this.set(attrs, options)) return false; 
    } else { 
     if (!this._validate(attrs, options)) return false; 
    } 

    // Set temporary attributes if `{wait: true}`. 
    if (attrs && options.wait) { 
     this.attributes = _.extend({}, attributes, attrs); 
    } 

    // After a successful server-side save, the client is (optionally) 
    // updated with the server-side state. 
    if (options.parse === void 0) options.parse = true; 
    var model = this; 
    var success = options.success; 
    options.success = function (resp) { 
     // Ensure attributes are restored during synchronous saves. 
     model.attributes = attributes; 
     var serverAttrs = model.parse(resp, options); 
     if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 
     if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 
      return false; 
     } 
     if (success) success(model, resp, options); 
     model.trigger('sync', model, resp, options); 
    }; 
    wrapError(this, options); 

    method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); 
    if (method === 'patch') options.attrs = attrs; 
    xhr = this.sync(method, this, options); 

    // Restore attributes. 
    if (attrs && options.wait) this.attributes = attributes; 

    return xhr; 
}, 
2

In meinem Fall versagt es aufgrund validations.As i das Modell speichern sie alle Attribute des Modells validiert und die Sammlung, die ich für die Auflistung Schnittstelle verwende nicht erforderlich alle ein Attribute des Modells.

Ich war mit den gleichen Problemen konfrontiert und in Google suchen und Ihre Frage gefunden und die Lösung und Kommentare gelesen. Als ich merke, dass in aktualisierten Backbone-Spezifikationen erwähnt wird, wenn Model.Save() vor Modellanforderungen ausführt, es zuerst Call Validate und wenn Validierung erfolgreich ist, wird es weiter gehen andere weise fehlschlägt, und das ist der Grund, warum es keine Netzwerkanforderung in Chrome Debugger Netzwerk Registerkarte zeigt.

Ich habe die Lösung für den Fall geschrieben, mit dem ich konfrontiert bin, andere könnten verschiedene Probleme haben.

0

Backbone sync function ist, was ich mit aufgewickelt. Sie müssen 'update' als ersten Parameter übergeben (den Parameter 'method').

+0

Es wäre schön zu wissen, wofür die Down-Abstimmung ist. Viel konstruktiver für mich und diese Seite auch :) – Stubbs