2012-11-14 17 views
19

Ich nenne das Speichern mit:Backbone model.save() wird bei Versand statt POST PUT

console.log(this.model.isNew()); 
console.log(this.model); 

this.model.save({}, { 
    success: function (model, response, options) { 
     console.log(response); 
    }, 
    error: function (model, xhr, options) { 
     console.log(xhr.result.Errors); 
    } 
}); 

Die isNew() false zurück. Aber der Ausgang des this.model hat eine ID von 0 (this.model.id 0 als auch)

Meine url ist url: ROOTAREA + "/Expenses/Entry/",

Aktualisierung funktioniert gut, und Zwecke verwendet, wie erwartet.

Edit: hier ist ein Teil meines Modells:

defaults: function() { 
     return { 
      DocumentDate: "", 
      JobNo_: "", 
      PhaseCode: "", 
      WorkTypeCode: "", 
      Description: "", 
      Quantity: 0, 
      UnitCost: 0, 
      ExpenseCurrencyCode: "", 
      ReimbursementCurrencyCode: "", 
      UnitofMeasureCode: "DIEM", 
      LineNo_: 0 
     }; 
    }, 
    idAttribute: "LineNo_", 

Antwort

27

ID sollte nicht einmal für einen neuen Eintrag vorhanden sein. Das Problem tritt in dem Teil auf, den Sie nicht angezeigt haben - in dem Teil, in dem Sie das Modell instanziieren, erstellen und auffüllen. Hier

ist ein Zitat von the Backbone documentation:

Wenn das Modell noch keine id hat, wird es als neu.

Aus Ihrem Code geht hervor, dass Sie ein ID-Attribut zuweisen. Ihr Backend sollte das tun. Und da Sie es auf einem Client tun, Rückgrat setzt es nicht neu es, und verwendet PUT

+0

ich gemacht habe. Sollte ich LineNo_ auf etwas anderes als 0 ändern? – Rail24

+0

@ Rail24 Entfernen Sie es vollständig, wenn Sie können. Backbone überprüft die ID auf null, um festzustellen, ob sie neu ist. Siehe http://documentcloud.github.com/backbone/docs/backbone.html#section-63 – nikoshr

+0

Ich änderte LineNo_ als Standard auf Null und löste mein Problem! Danke toninoj! – Rail24

2

Sie die ID in Standardwerte angeben, nur sicherstellen, dass es auf null gesetzt ist

(wird isNew auf true gesetzt werden)
19

Die obigen Antworten sind korrekt, wenn die model Sie sind .save 'ing hat eine id Attribut Backbone wird eine PUT anstatt eine POST tun.

Dieses Verhalten kann einfach durch type: 'POST' zu Ihrem Block speichern Hinzufügen außer Kraft gesetzt werden:

bearbeitet meinem Beitrag zeigt das Modell
var fooModel = new Backbone.Model({ id: 1}); 

fooModel.save(null, { 
    type: 'POST' 
}); 
+2

Danke für deinen Beitrag, es hat mir in einem ähnlichen Fall geholfen. Ich fand heraus (Lesen der Backbone-Quelle), dass Sie das Modell nicht erstellen müssen, speichern Sie es und fügen Sie dann der Sammlung hinzu, müssen Sie nur Typ: "POST" an die create() -Methode der Sammlung übergeben: fooCollection.create ({ID: 1}, {Typ: 'POST'}); – Shu

+0

Für andere Lösungen siehe: [Was ist der am wenigsten hässliche Weg, um Backbone.sync Updates zu zwingen, POST anstelle von PUT zu verwenden?] (Http://stackoverflow.com/q/8527694/1218980) –

Verwandte Themen