backbone.js - template - ¿Cómo disparo la devolución de llamada correcta en un model.save()?
backbonejs github (8)
El primer argumento de guardar es los atributos para guardar en el modelo:
this.model.save( {att1 : "value"}, {success :handler1, error: handler2});
this.model.save({
success: function(model, response){
console.log(''success'');
},
error: function(){
console.log(''error'');
}
})
El modelo se publica correctamente en el servidor que gestiona el guardado, pero la devolución de llamada exitosa no se activa. ¿Debo enviar algo desde el servidor?
El siguiente es el código que estoy usando para guardar el modelo de red troncal.
this.model.save(model,{
success:function(model){
console.log("Saved Successfully");
},
error:function(model){
console.log("Error");
}
});
Aclamaciones
Roy MJ
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 forma, cada vez que ejecute this.model.save (), ejecutará la función onSaveSuccess como una devolución de llamada si su sincronización es exitosa
Para aquellos que desean guardar un modelo, sin actualizar los atributos, puede hacer lo siguiente:
model.once("sync", function(model, response, options){
//
});
model.once("error", function(model, response, options){
//
});
model.save();
Por alguna razón desconocida , ninguno de los métodos anteriores funcionó para mí. La api solo no fue golpeada en mi caso.
Pero más tarde mientras buscaba en esto, me topé con este enlace , donde alguien había intentado con null
lugar de {}
como el 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.
Puedes usar la lib de subrayado de la siguiente manera ya que la red troncal ya depende de esto. Recuerde que el primer argumento de guardar debe tener atributos o simplemente puede pasar {} en caso de que quiera guardar el modelo.
this.model.save({}, _.bind(function(model, response){
//Do whatever you want e.g.
this.collection.add(model)
}, this))
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 el éxito su servidor no devuelve un objeto JSON, realice una opción de guardar con 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.
así que estoy un poco confundido, ¿todavía necesito pasar todos los atributos para poder llamar a un evento guardado? ¿Qué pasa si mi modelo es grande? No deseo configurar cada propiedad manualmente
im calling model.save e intento 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'')
simplemente puede pasar un objeto en blanco porque un atributo en blanco simplemente no ampliará los atributos, no hace nada:
this.model.save({}, {
success: function (model, response) {
console.log("success");
},
error: function (model, response) {
console.log("error");
}
});