2011-10-20 10 views
11

Con backbone.js guardo un modelo. Se envía un PUT al servidor y se devuelve la respuesta. La primera vez que lo hago, devuelve éxito, las siguientes veces se devuelve un error, porque después de la primera vez la respuesta se agrega al modelo.Cómo obtener una buena respuesta al guardar un modelo

función de ahorro de Backbone.js:

saveCountry: function() { 
    this.model.save({},{ 
     success: function(model, response) { 
      console.log('success! ' + response); 
     }, 
     error: function(model, response) { 
      console.log('error! ' + response); 
     } 
    }); 
    this.render(); 

    return false; 
}, 

PHP devuelve una cadena JSON-:

{"response": "Model saved!"} 

Siguiendo PUT de obtener un error como respuesta, porque se añade la 'respuesta' al modelo:

Unknown column 'response' in 'field list' 

¿Por qué se agrega la respuesta al modelo y cómo lo evito?

+0

¿No podría simplemente hacer un condicional y omitir la 'respuesta' en su script php? – swatkins

+0

Podría, pero pensé que sería más limpio dejar que el lado del servidor decida la respuesta. – GijsjanB

+0

¿Te refieres al lado del "cliente"? – swatkins

Respuesta

7

De la documentación de la espina dorsal del modelo save:

Establecer un hash del modelo de atributos y sincronizar el modelo con el servidor. Si el servidor devuelve un hash de atributos que difiere, el estado del modelo se establecerá de nuevo. http://documentcloud.github.com/backbone/docs/backbone.html#section-41

¿Qué hacer para que funcione: no regresan { "respuesta": "Modelo salvado!"} Desde el servidor. Simplemente devuelve un éxito (estado 200) sin contenido.

Si el guardado no funcionó, devuelva un JSON con los errores, y Backbone activará un evento de error en su modelo, con el JSON que proporcionó (consulte http://documentcloud.github.com/backbone/docs/backbone.html#section-41 y http://documentcloud.github.com/backbone/docs/backbone.html#section-145).

6

Sólo para resucitar un hilo antigua ...

No siempre es posible/deseable cambiar la respuesta a volver desde el servidor.

Otra solución es anular parse en el modelo para encargarse de esto. Para su situación, donde la respuesta es inapropiada para TODOS sus modelos, podría hacerlo en una superclase.

MyModel = Backbone.Model.extend({ 
    parse: function(data) { 
     delete data["success"]; 
     return data; 
    } 
}); 

Address = MyModel.extend({ 
    saveCountry: function() { 
     this.model.save({},{ 
      success: function(model, response) { 
       console.log('success! ' + response); 
      }, 
      error: function(model, response) { 
       console.log('error! ' + response); 
      } 
     }); 
     this.render(); 

     return false; 
    }, 

    ... 

}); 
Cuestiones relacionadas