2011-09-19 15 views
12

Ho qualche problema a salvare le modifiche ai singoli modelli in una raccolta. I modelli che sono stati caricati (tramite una collezione .reset()) stanno emettendo un POST (come se fossero nuovi) invece del PUT atteso..save() sul modello esistente causa POST invece di PUT

Qui è l'approccio che sto prendendo:

APPVIEW

  • Carichi la collezione bambino tramite this.model.childcollection.reset (JSON dati dal server);

  • nella sua funzione di rendere, crea un nuovo childview per ogni elemento della collezione e lo rende:

    render: function() { 
         var el = this.el; 
         this.model.childcollection.forEach(function(s) { 
         var view = new ChildView({ model: s }); 
         el.append(view.render().el); 
        }); 
        return this; 
    }, 
    

ChildView

  • In uno dei suoi eventi si sta cambiando alcuni valori del modello sottostante e chiama save:

    this.model.set(
         { 
          ValueA: somevalue, 
          ValueB: somevalue 
         }, 
         { 
          error: function() { 
           console.log("Error saving model"); 
          }, 
          success: function() { 
           console.log("Model change saved"); 
          } 
         }); 
        this.model.save(); 
    

Osservazioni:

  • POST (senza bambino id) è chiamato al posto del PUT (con bambino Id)
  • Elementi figlio sono Ids impostare

Qualcuno può dire me perché questo potrebbe accadere?

risposta

29

spina dorsale usato la proprietà .id (non attribuire) del modello per determinare se dovrebbe mettere o inviati, come mostrato di seguito nel codice sorgente: https://github.com/documentcloud/backbone/blob/master/backbone.js#L344-346

se si sta facendo un post durante il salvataggio di un modello esistente, questo significa che la proprietà .id non è stata caricata correttamente. anche se una chiamata a model.get("id") restituisce il risultato corretto, una chiamata a model.id deve restituire il risultato corretto per far sapere che questo non è un nuovo modello.

essere sicuri che sei attributo id del modello si chiama id, o se non lo è, assicurarsi di impostare il idAttribute del modello:

MyModel = Backbone.Model.extend({ 
    idAttribute: "myCustomId" 
}); 
+0

Grazie - che sembra essere stato il problema - la 'Id 'nome della proprietà sul modello lato server è stato in maiuscolo. Cambiarlo in minuscolo sembra averlo risolto. – UpTheCreek

+1

In alternativa, è possibile che sia stato modificato il nome del campo che Backbone considera il campo ID utilizzando l'opzione 'idAttribute' quando si estende Backbone.Model. –

Problemi correlati