2012-05-08 10 views
9

Ho provato backbone.js e sono stato stymied quando creo un nuovo oggetto modello, quindi chiamo model.save(). Mi aspetto il comportamento predefinito di backbone.js per aggiornare l'oggetto modello con l'id dal database, ma non lo è. Questo non dovrebbe succedere? Ho verificato che sto ottenendo un post con gli attributi in formato json. Il mio server salva il json su una tabella e quindi restituisce il json con un nuovo campo id a backbone.js. È corretto? Il mio server dovrebbe restituire l'intero nuovo oggetto o solo l'id o cosa?backbone.js non sta aggiornando l'id dell'oggetto modello dopo il salvataggio, perché no?

//contents of the POST from backbone.js 
    { "text":"this is a test" } 

//reply from my server 
    { id:"15", text:"this is a test" } 

Il mio codice del campione è al di sotto

var SQLRow = Backbone.Model.extend({ 
table:"", 
urlRoot:'db', 
url:function() { 
    return "/" + this.urlRoot + "?table=" + this.table + 
       "&id=" + this.attributes.id; 
    } 
}); 

var Xtra = SQLRow.extend ({ 
    table:'Xtra' 
}); 

var row = new Xtra({ 
    text: "this is a test" 
}); 

alert(row.url()); 
row.save() 
alert("row:" + row.get("id")); 
+0

Che aspetto ha la risposta restituita dalla chiamata di salvataggio? – kinakuta

risposta

6

Difficile da dire dal tuo post. Due idee:

1) la risposta dal server non ha esito positivo. Come viene restituita la chiamata salvata?

2) L'attributo "id" è denominato diversamente da ID. Per tenere conto del diverso nome aggiungere il seguente al vostro modello:

idAttribute : "MyModelsID", 

EDIT

Stai probabile che di fronte a un problema di temporizzazione, dove i fuochi di avviso prima che il ID è tornato. Invece dei tuoi ultimi due linee provare questo:

row.save(null, 
       { 
       success : function(model, response) { alert(model.get('id'); } 
       } 
     ); 

ALTERNATIVA

Come @mu_is_too_short accennato, un altro modo è quello di ascoltare per il cambiamento anche sul modello e rispondere all'evento. (Stavo solo cercando di mantenere la risposta il più vicino possibile al tuo codice). Ma qualcosa di simile al seguente pseudo codice dovrebbe iniziare ...

var myView = Backbone.View.extend({ 
      .... 
      initialize : function() { 
       this.collection.bind('change', this.SOME_LISTENING_FUNC ); 

      } 
    }); 

O, se siete in una collezione/vista-meno qualcosa mondo come questo crea una listenr ...

row.on('change', function() { /* do stuff */ }, this);    
+1

Oppure associa un gestore "" cambia "al modello e raccogli il risultato del' save' in questo modo. Backbone è un framework basato su eventi, che cerca di schiacciarlo in un modello seriale non funziona così bene (questa parte è principalmente per Cjolly). –

+0

@muistooshort - così ci incontriamo di nuovo moo. Grazie per l'alternativa, ho incorporato qualche pseudo codice nella risposta. – EBarr

+3

C'erano due problemi con il codice. Per prima cosa il formato json restituito dal server ha bisogno anche delle chiavi degli attributi quotati (es. {Id: "ax"} in realtà dovrebbe essere {"id": "ax"}. Dopo aver apportato tale modifica ero in affari, tuttavia , il mio avviso immediatamente dopo il salvataggio probabilmente non mostrerà mai la vera natura dell'oggetto in quanto il salvataggio è una chiamata ajax asincrona e dovremmo sempre arrivare all'avviso prima che la gestione di ajax e backbone.js sia completata. mu è a breve ** sopra suggerisce è la strada giusta da fare: – Cjolly

1

Questa risposta è basata su un commento di Cjolly nella risposta sopra.

E 'essenziale per rendere il Backbone.Model.save([attributes],[options]) successo nel assiging il modello con id del modello appena generato dal server, che il server restituisce il id modello in una stringa JSON come questo { "id" : <the id> }. (nota che è "id" e non id).

In sostanza spina dorsale si aspetta giustamente una stringa JSON e in contrasto con come gli oggetti possono essere definiti in JavaScript senza chiavi citati, JSON richiede le chiavi oggetto da citare (vedi JSON Spec - does the key have to be surrounded with quotes?)

Dal momento che secondo il commento di Cjolly questo è stato il problema essenziale, voglio evidenziare questa soluzione in una seconda risposta. In parte perché sono stato colpito dallo stesso problema e solo leggendo attraverso i commenti sono stato in grado di ricevere l'intuizione.

0

Ho affrontato lo stesso problema e quello che ho trovato è che la mia funzione validate del modello salvato effettivamente invalida il modello restituito dal back-end. Ecco perché i miei campi non sono stati aggiornati correttamente.

0

Forse è un po 'fuori tempo, ma oggi avevo lo stesso ID mancante. Si scopre che il server invia semplicemente un'intestazione "Posizione" con un reindirizzamento contenente il nuovo ID, ma non restituisce l'oggetto persistente. L'aggiunta dell'oggetto alla risposta era la soluzione. Sembra che non restituire l'oggetto sia un comportamento standard con i controller JSON generati da Roo (Spring).

Problemi correlati