2012-07-31 12 views
7

Me gustaría guardar un modelo modificado en la base de datos (establecido anteriormente). Si la operación de guardar se redirigió a otra página (como ejemplo, podría ser cualquier otra acción).Cómo guardar con backbone.js sin especificar qué atributos, pero con una devolución de llamada

Model.save puede tener dos propiedades opcionales. Primero es un hash de propiedades, y el segundo son las opciones (como el éxito y la devolución de llamada de error). http://backbonejs.org/#Model-save

somemodel.set({foo: 'bar'}); 
//lots of other logic and misc steps the user has to do 
somemodel.save(); //on success should go here 

Desde los atributos ya están definidos, solo me falta la devolución de llamada.

En el pasado hice:

somemodel.save(somemodel.toJSON(), { 
    success: function() { 
     //other stuff 
    } 
); 

o pasando los valores de nuevo para el método Save

somemodel.save(
    { foo: this.$('input').val()}, 
    { success: function(){} 
); 

Estoy buscando una manera de limpiar esto. Los documentos indican que el modelo disparará un estado de cambio si hay nuevas propiedades. Pero me gustaría redirigir al usuario de todos modos (guardando en contenido nuevo o antiguo/sin alterar).

esto no existe:

somemodel.on('success', function(){}); 

y esto, es sólo para la validación:

if(somemodel.save()) { //action } 

también "sincronización" es el evento incorrecto (ya que también trabaja para destruir)

¿Alguna ayuda?

Respuesta

12
somemodel.save(
    {}, // or null 
    { 
      success: function(){} 
    } 
); 

le permitirá guardar un modelo con una devolución de llamada específica sin modificar las claves existentes.

Y un violín http://jsfiddle.net/h5ncaayu/

Para evitar que pase la devolución de llamada éxito como opción, puede

  • utilizar la promesa devuelto por save:

    somemodel.save().then(...youcallback...) 
    
  • o utilizar un evento :

    somemodel.on('sync', ...youcallback...); 
    somemodel.save(); 
    
+0

Gracias, esto es definitivamente mejor que lo que tenía. Para mal, todavía se siente un poco sucio (proporcione un paramaestro, solo por el hecho de proporcionar un parámetro). Tal vez debería profundizar y sobrescribir/extender Backbone.sync para devolver un evento de "éxito" y "error". Es extraño que lo haga de manera predeterminada, ya que la red troncal se trata tanto de un acoplamiento débil con eventos como de devoluciones de llamadas. – Jareish

+1

{} y null no son lo mismo en este contexto.{} significa enviar un objeto vacío al servidor, mientras que nulo significa que no está pasando ningún objeto para guardar(), y que save() debería enviar los atributos del objeto. – jerzy

+0

@jerzy Eso es incorrecto, compruebe Backbone doc en 'model.save': se envía una representación completa del recurso al servidor si no se pasa una opción' patch: true' http://backbonejs.org/# Modelo-guardar. {} y null tendrán el mismo comportamiento – nikoshr

3

Backbone.Model tiene un método muy conveniente llamado "changedAttributes" que devolverá un hash de atributos modificados que puede pasar para guardar. Así que ...

model.save(
    model.changedAttributes(), 
    { 
     success : _.bind(function() {...},this), //_.bind() will give scope to current "this" 
     error : _.bind(function() {...},this); 
    } 
); 

agradable y limpio ...

+0

También es agradable y definitivamente será útil, pero prefiero la otra solución mejor, creo (menos código). ¡Buena solución con ese enlace! Siempre guardé esto en otra variable para poder acceder en la devolución de llamada de éxito/error, pero esto se siente más robusto. – Jareish

+0

Vale la pena mencionar que este enfoque no informará los atributos modificados fuera de un evento de cambio, por lo que es posible que changedAttributes() devuelva falso en lugar de sus atributos cambiados reales. Sólo algo para tener en cuenta. –

Cuestiones relacionadas