2012-11-14 9 views
19

io chiamo Salva utilizzare questo:Backbone model.save() è l'invio PUT invece di POST

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); 
    } 
}); 

I isNew() restituisce false. Ma l'uscita di this.model ha un ID di 0. (this.model.id è 0 oltre)

mio URL è url: ROOTAREA + "/Expenses/Entry/",

aggiornamento funziona bene, e usi PUT come previsto.

Edit: ecco la parte del mio modello:

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

risposta

27

ID non dovrebbe esistere anche per una nuova voce. Il problema è nella parte che non hai mostrato - nella parte in cui istanziati, crea e popola il modello.

Ecco una citazione da the Backbone documentation:

Se il modello non ha ancora un id, è considerata nuova.

È chiaro dal codice che si assegna un attributo id. Il tuo back-end dovrebbe farlo. E dal momento che si sta facendo su un client, spina dorsale presume che essa non è nuovo, e usa PUT

+0

Ho fatto una modifica al mio post che mostra il modello. Devo cambiare LineNo_ in qualcosa di diverso da 0? – Rail24

+0

@ Rail24 Rimuovilo completamente, se puoi. Backbone controlla l'id con null per determinare se è nuovo. Vedi http://documentcloud.github.com/backbone/docs/backbone.html#section-63 – nikoshr

+0

Ho cambiato LineNo_ in modo predefinito come null e ha risolto il mio problema! Grazie, toninoj! – Rail24

2

È possibile specificare l'id di default, basta assicurarsi che sia impostato su null (isNew verrà impostata su true)

19

Le risposte sopra riportate sono corrette in quanto se lo model si è .save ha un attributo id, il backbone eseguirà uno PUT anziché un POST.

Questo comportamento possono essere sovrascritti semplicemente aggiungendo type: 'POST' al vostro salvataggio blocco:

var fooModel = new Backbone.Model({ id: 1}); 

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

Grazie per il tuo post, mi ha aiutato in un caso simile. Ho scoperto (leggendo il sorgente Backbone) che non è necessario creare il modello, salvarlo e quindi aggiungerlo alla raccolta, basta passare il tipo: "POST" al metodo create() della collezione: fooCollection.create ({id: 1}, {type: 'POST'}); – Shu

+0

Per altre soluzioni, vedere: [Qual è il modo meno brutto per forzare gli aggiornamenti di Backbone.sync a utilizzare POST anziché PUT?] (Http://stackoverflow.com/q/8527694/1218980) –

Problemi correlati