2012-05-08 7 views
9

He estado probando backbone.js y me he quedado bloqueado cuando creo un nuevo objeto modelo y luego llamo a model.save(). Estoy esperando el comportamiento predeterminado de backbone.js para actualizar el objeto modelo con el id de la base de datos, pero no es así. ¿No se supone que esto suceda? He verificado que recibo una publicación con los atributos en formato json. Mi servidor guarda el json en una tabla y luego devuelve el json con un nuevo campo de id a backbone.js. ¿Es esto correcto? ¿Debería mi servidor devolver todo el nuevo objeto o solo el id o qué?backbone.js no actualizando la identificación del objeto modelo después de guardar, ¿por qué no?

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

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

Mi código de ejemplo está por debajo

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

¿Cómo es la respuesta que devuelve la llamada guardada? – kinakuta

Respuesta

6

resistente a contar desde su puesto. Dos ideas:

1) la respuesta del servidor no es exitosa ¿Qué devuelve la llamada guardada?

2) Su atributo "id" tiene un nombre distinto a ID. Para tener en cuenta la diferente nombre añada lo siguiente a su modelo:

idAttribute : "MyModelsID", 

EDITAR

es muy probable frente a un problema de tiempo, donde ha vuelto a los fuegos de alerta antes de la ID. En lugar de sus dos últimas líneas probar esto:

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

ALTERNATIVA

Como @mu_is_too_short mencionado, otra manera es escuchar para el cambio incluso en el modelo y responder al evento. (Solo intentaba mantener la respuesta lo más cerca posible de tu código). Sin embargo, algo así como el pseudo código siguiente debe empezar ...

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

      } 
    }); 

O, si estás en una colección/foto-less mundo algo como esto crea una listenr ...

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

O enlazar un controlador '' change '' con el modelo y recoger el resultado del 'save' de esa manera. Backbone es un marco impulsado por eventos, tratar de mezclarlo en un modelo en serie no funciona tan bien (esta parte es principalmente para Cjolly). –

+0

@muistooshort - así que nos volvemos a encontrar moo. Gracias por la alternativa, incorporé un pseudo código en la respuesta. – EBarr

+3

Hubo dos problemas con el código. Primero, el formato json devuelto por el servidor también necesita las claves de los atributos citados (es decir, {id: "ax"} realmente debería ser {"id": "ax"}. Después de hacer ese cambio, yo estaba en el negocio; , mi alerta inmediatamente después del guardado probablemente nunca mostraría la verdadera naturaleza del objeto, ya que el guardado es una llamada ajax asincrónica y siempre obtendríamos la alerta antes de que se completara el manejo de ajax y backbone.js. Agregar un controlador de cambios como ** mu es corto ** arriba sugiere que es la manera correcta de hacerlo: – Cjolly

1

Esta respuesta se basa en un comentario de Cjolly en la respuesta anterior.

Es esencial para hacer que el éxito Backbone.Model.save([attributes],[options]) en assiging el modelo con el ID del modelo recién generado desde el servidor, que devuelve el servidor de id el modelo en una cadena JSON como esto { "id" : <the id> }. (tenga en cuenta que es "id" y no id).

En columna vertebral esencia razón, espera una cadena JSON y en contraste con cómo los objetos pueden ser definidos en Javascript y sin llaves citados, JSON requiere las claves de objeto para ser citados (ver JSON Spec - does the key have to be surrounded with quotes?)

Dado que, según el comentario de Cjolly este ha sido el problema esencial, quiero destacar esta solución en una segunda respuesta. Parcialmente porque fui golpeado por el mismo problema y solo leyendo los comentarios pude obtener la información.

0

He enfrentado el mismo problema y lo que he encontrado es que mi función validate del modelo guardado en realidad invalida el modelo devuelto desde el servidor. Es por eso que mis campos no se actualizaron correctamente.

0

Tal vez es un poco exagerado, pero hoy tenía la misma identificación faltante. Resulta que el servidor simplemente envía una "Ubicación" de encabezado con un redireccionamiento que contiene la nueva identificación, pero no devuelve el objeto persistente. Agregar el objeto a la respuesta fue la solución. Parece que no devolver el objeto es un comportamiento estándar con controladores Json generados por Roo (Spring).

Cuestiones relacionadas