¿Cómo puedo activar la devolución de llamada exitosa en un model.save ()?


106
this.model.save({
  success: function(model, response){
    console.log('success');
  },
  error: function(){
    console.log('error');
  }
})

El modelo se publica correctamente en el servidor que maneja el guardado, pero la devolución de llamada exitosa no se activa. ¿Necesito enviar algo desde el servidor?


7
Resulta que lo estaba haciendo mal: la sintaxis correcta debería ser: this.model.save (newItem, {success: ..., error: ...})
Running Turtle

8
'null' también parece funcionar bien como marcador de posición.
UpTheCreek

@UpTheCreek Gracias. Eso ayudó. Miré la fuente y pasé una cadena vacía como clave y valor. Sin embargo, me gusta más tu método.
Pramod

@UpTheCreek null no funcionó para mí por alguna razón, pero pasar un attr obj vacío sí lo hizo :)
KoalaKid

Respuestas:


123

El primer argumento de guardar son los atributos para guardar en el modelo:

this.model.save( {att1 : "value"}, {success :handler1, error: handler2});

9
Estoy un poco confundido: (1) pensé que la red troncal siempre enviaba todo el modelo durante el guardado (que no es posible enviar actualizaciones parciales del modelo). Entonces, ¿cuál es el propósito del atributo nombre-valores? (2) ¿Qué sucede si solo desea guardar el modelo después de realizar algunos .set () s? ¿Por qué la lista de atributos? (3) En los documentos, el parámetro de lista de atributos se muestra como opcional. ¿Puedes aclarar? Gracias.
UpTheCreek

7
Puede hacer un montón de "conjuntos" con sus atributos y luego guardar sin ningún atributo. Todos los atributos del modelo se envían siempre al servidor. Guardar con atributos es solo un atajo para configurar + guardar.
Julien

5
Por tonto que parezca, esto es exactamente lo que hace, es una pena que esté mal documentado.
Kevin

51
En mis pruebas, parece que las devoluciones de llamada de éxito y error no se activan si no pasa algo para el parámetro "atributos". Esto parece contradecir la documentación ... model.save ([atributos], [opciones]) indicaría que los atributos son opcionales. Cuando incluyo atributos o nulo para los atributos, se activan mis devoluciones de llamada de éxito y error. Cuando no incluyo nada para los atributos, las devoluciones de llamada NO se activan.
Kevin

6
comprobó el código fuente de backbone.js [ backbonejs.org/docs/backbone.html ]. parece que el atributo es obligatorio ... si solo se proporciona 'opción', las funciones asumen que es el 'atributo' y estropean la llamada
Kumaresan

58

Por alguna razón desconocida , ninguno de los métodos anteriores funcionó para mí. La API solo no fue acertada en mi caso.

Pero más tarde, mientras buscaba esto, me encontré con este enlace , donde alguien lo había intentado en nulllugar de {}como primer parámetro.

this.model.save(null, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

entonces, esto funcionó para mí. Espero que esto le ayude también.


3
Esta es la respuesta correcta. Si pasa nulo, Backbone enviará todos los atributos al servidor para guardarlos.
Paul Oliver

Extraña peculiaridad, pero mi método elegido.
Matt Fletcher

37

Su servidor debe devolver un objeto JSON. Si la respuesta no es un objeto JSON, las devoluciones de llamada no se activarán.

Si para tener éxito, su servidor no devuelve un objeto JSON, realice un guardado con la opción dataType: "text" , como esta:

this.model.save([],{
 dataType:"text",
 success:function() {},
 error:function() {}
});

Con esta opción no estará esperando un JSON en respuesta, sino un texto, y así se lanzará la devolución de llamada.


Santa mierda gracias. Esto me estaba volviendo loco. Sería increíble si esto estuviera documentado en los documentos de Backbone en algún lugar,
Tobias J

esto me salvó el culo. Estaba usando res.json ({éxito: resultado}) con Express 4, y eso todavía me estaba dando problemas. Quizás deba hacer: res.json ({"success": "result"}) o algo ...
Alexander Mills

¡Muchas gracias! Esto hizo mi dia.
alcfeoh

11

Puede usar el guión bajo lib de la siguiente manera, ya que la columna vertebral ya depende de esto. Recuerde que el primer argumento de guardar debe tener atributos o simplemente puede pasar {} en caso de que desee guardar el modelo en sí.

this.model.save({}, _.bind(function(model, response){
  //Do whatever you want e.g.
  this.collection.add(model)
}, this))

8

así que estoy un poco confundido, ¿todavía necesito pasar todos los atributos para poder llamar a un evento de guardado? ¿Qué pasa si mi modelo es grande? No deseo configurar cada propiedad manualmente

Estoy llamando model.save e intentando hacer lo siguiente:

this.model.save(
    {
        success: function (model, response) {
            console.log('model saved');
        }
    });

ok, solo para responder mi propia pregunta en caso de que alguien encuentre esta publicación, hice lo siguiente que funciona:

this.model.save({ id: this.model.get('id') },
    {
        success: function (model, response) {
            console.log("success");
        },
        error: function (model, response) {
            console.log("error");
        }
    });

EDITAR: No pude responderte por alguna razón, pero puedo editar

pero no tiene que establecer id: this.model.get('id')puede simplemente pasar un objeto en blanco porque un atributo en blanco simplemente no extenderá los atributos, no hace nada:

this.model.save({}, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

4

El siguiente es el código que estoy usando para guardar el modelo de backbone.

this.model.save(model,{
   success:function(model){
       console.log("Saved Successfully");
   },
   error:function(model){
       console.log("Error");
   }
});

Salud

Roy MJ


es algo molesto pasar un local modela un this.model.. modeldebería ser attributes, que se configura y guarda junto con todo enthis.model
Funkodebat

@Funkodebat: Sí. :) .. De hecho, pensé que esto era similar al jquery-ajax normal, pero en Backbone, el primer parámetro sería el modelo. No necesariamente pasándolo, sino obteniendo el correspondiente. De hecho es bastante perturbador ... :(
Roy MJ

Bueno, la verdad es que no, no pasas el modelo al llamar a guardar. el primer argumento de save son atributos adicionales que puede establecer antes de llamar a save. Sería como llamar model.set(model.toJSON()); model.save(). no hay razón para establecer un modelo a lo que el modelo está configurado ... es el epítome de redundante pasar un modelo a sí mismo al guardar.
Funkodebat

2
@Funkodebat He rechazado sus cambios en esta respuesta de hace 3 años ya que cambiaron radicalmente la respuesta del autor. Esta no es la intención del sistema de edición / moderación. Si la respuesta ya no es relevante o apropiada, vota en contra y escribe una nueva. Las herramientas de moderación sirven para corregir la gramática, el formato, la ortografía y las mayúsculas, no para ajustar las respuestas de otros usuarios.
reach4thelasers

2
La comunidad no estaría de acuerdo contigo. Es una pregunta muy votada con una respuesta máxima muy votada. La pregunta parece relevante para la comunidad. Si no está de acuerdo con algo, use el botón de voto negativo. No es su lugar dictar qué preguntas y respuestas tienen derecho a estar en este sitio, y ciertamente no es su lugar modificar las respuestas de otros usuarios hasta el punto de que su significado cambie drásticamente.
reach4thelasers

1

Para aquellos que quieran guardar un modelo, sin actualizar los atributos, pueden hacer lo siguiente:

model.once("sync", function(model, response, options){
    //
});
model.once("error", function(model, response, options){
    //
});
model.save();

1

En su función de inicialización, vincule el método de sincronización a un método que defina (onSaveSuccess)

            initialize: function (options) {
                    this.model.on('sync', _.bind(this.onSaveSuccess, this));
},
            onSaveSuccess: function() {
                console.log('saved');
                this.render();
            },

De esta manera, cada vez que ejecute this.model.save (), ejecutará la función onSaveSuccess como una devolución de llamada si su sincronización es exitosa

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.