2011-08-25 13 views
11

Utilizzando Backbone.JS, sono in grado di creare nuovi modelli e salvarli correttamente sul server. Effettuano correttamente una chiamata ajax e gli elementi dell'interfaccia utente sottoscritti vengono aggiornati in modo appropriato. Il problema in cui mi imbatto è che non conosco l'ID dell'oggetto appena creato.Come recuperare l'ID del modello quando si crea un nuovo?

È possibile vedere nelle intestazioni di risposta per le mie chiamate di creazione, che il server restituisce un'intestazione di posizione come: Location https://localhost/rest/beta/mobile/footer/OTo3Njow con l'ultimo parametro che rappresenta l'ID appena creato.

Come posso ottenere questo ID senza sovrascrivere backbone.sync? Se devo scavalcare il backbone.sync, qual è il metodo più pulito?

UPDATE Sembra che la mia organizzazione si utilizza una versione precedente Backbone.js in cui il metodo di analisi di modelli non fornisce un riferimento all'oggetto XHR, altrimenti avrei potuto catturare l'ID e fare l'assegnazione di lì.

risposta

10

Il server deve inviare indietro un Oggetto JSON contenente lo id del modello, più eventuali altri attributi che desidera aggiornare. Se lo fa, Backbone catturerà automaticamente l'id.

Se questo non è un'opzione, è necessario eseguire l'override Backbone.sync, perché allora la vostra API (che comunica il nuovo ID nell'intestazione posizione al posto del corpo di risposta) non è conforme a quello che Backbone supporta fuori dalla scatola.


Se il server esegue già questa operazione e si desidera ottenere l'ID, dipende da chi ha bisogno di sapere. Se è il codice chiamante model.save(), allora può passare in un callback successo:

model.save({}, { 
    success: function(){ 
     // do something with model.id 
    } 
}); 

Se il modello in sé ha bisogno di essere avvisati quando si arriva un id, è possibile utilizzare un inizializzatore:

var MyModel = Backbone.Model.extend({ 
    initialize: function(){ 
     this.bind("change:id", function(){ 
      // … 
     }); 
    } 
}); 
1

Ho risolto questo sovraccaricando il parametro successo nel backbone.sync

// Return XHR on success 
params.success = function(response, text, XHR) { 
    if(_.isFunction(model.xhrParse)) { model.xhrParse.call(model, response, XHR); } 
    success.call(model, response); 
} 

e con l'aggiunta di un nuovo metodo per il mio modello base "xhrParse":

xhrParse: function(resp, XHR) { 
    var locationHeader = XHR.getResponseHeader('Location'); 
    if(locationHeader && !this.id) { 
    var xplode = locationHeader.split("/"); 
    this.id = xplode[xplode.length - 1]; 
    } 
    return resp; 
} 
+2

Usa 'this.set ('id', ...)'. Quando l'id di un modello cambia, devono succedere altre cose: l'ID viene aggiornato nell'oggetto attributi del modello, se il modello si trova in una raccolta, la raccolta deve essere avvisata che ha un ID, ecc. – s4y

+0

Catture molto buone. Grazie. –

Problemi correlati