2011-08-25 13 views
11

Usando Backbone.JS, puedo crear con éxito nuevos modelos y guardarlos en el servidor. Realizan con éxito una llamada ajax y los elementos de la IU suscritos se actualizan adecuadamente. El problema con el que me topé es que no conozco la ID del objeto recién creado.¿Cómo recuperar la ID del modelo cuando se crea una nueva?

Puedo ver en los encabezados de respuesta para mis llamadas de creación, que el servidor está devolviendo un encabezado de ubicación como: Location https://localhost/rest/beta/mobile/footer/OTo3Njow con el último parámetro siendo el ID recién creado.

¿Cómo puedo obtener esta ID sin anular backbone.sync? Si tengo que anular backbone.sync, ¿cuál es el método más limpio?

ACTUALIZACIÓN Parece que mi organización está usando un Backbone.js de mayor edad en la que el método de análisis de los modelos no proporciona una referencia al objeto XHR, de lo contrario podría coger el ID y hacer la asignación de allí.

Respuesta

10

El servidor debe enviar de vuelta una Objeto JSON que contiene el id del modelo, más cualquier otro atributo que quiera actualizar. Si lo hace, Backbone automáticamente tomará la identificación.

Si no es una opción, debe anular Backbone.sync, porque entonces su API (que comunica el nuevo ID en el encabezado de ubicación en lugar del cuerpo de respuesta) no se ajusta a lo que Backbone admite de fábrica.


Si el servidor ya hace esto, y lo que desea para llegar a la identificación, que depende de quien tiene que saber. Si es el código de llamada model.save(), entonces se puede pasar en una devolución de llamada de éxito:

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

Si el modelo en sí necesita ser notificado cuando se pone un identificador, puede utilizar un inicializador:

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

que resolvieron este sobrecargando el parámetro de éxito en 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); 
} 

y mediante la adición de un nuevo método para mi modelo de 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

Use 'this.set ('id', ...)'. Cuando la identificación de un modelo cambia, deben ocurrir otras cosas: la identificación se actualiza en el objeto de atributos del modelo, si el modelo está en una colección, se debe notificar a la colección que tiene una identificación, etc. – s4y

+0

Muy buena captura. Gracias. –

Cuestiones relacionadas