backbone.js - source - Backbone.Model.destroy no activa la función de éxito en caso de éxito
underscore js download (4)
Acabo de tener el mismo problema. La solución que funcionó para mí fue asegurarse de devolver un modelo json del servidor que corresponda al eliminado.
edición: devolver una respuesta json vacía será suficiente.
No funcionó:
delete(model) {
// deleted model from db
return "Model was deleted";
}
Esto funcionó:
delete(model) {
// deleted model from db
return model;
}
o:
delete(id) {
// deleted model from db with this id
return new Model {id: id};
}
Entonces, dentro de uno de mis puntos de vista, tengo esta función:
delete_model: function() {
var answer = confirm("Are you sure you want to delete this element?");
if (answer) {
this.model.destroy({
success: function() {
console.log("delete was a success");
}
});
}
});
Cuando hago ping a eso, la llamada Ajax se apaga, el backend elimina correctamente el modelo y devuelve un encabezado 200 con "OK" como cuerpo ... pero el evento de éxito nunca se dispara. ¿Me estoy perdiendo de algo? ¿Qué debo hacer para que el backend sirva para disparar ese evento?
Eso me parece bien, exactamente lo que tengo en todas partes (excepto que tengo una function(model)
pero eso no debería importar en absoluto). Sé que las versiones anteriores de la red troncal no usaban la destroy(options)
sino que tenían la destroy(options)
destroy(success, failure)
. ¿Puedes asegurarte de tener la última versión?
También tuve este problema con mi interfaz de usuario. Tras DELETE
, la API regresó con una respuesta vacía de 200
.
Lo que sucede es que jQuery espera un cuerpo de respuesta json, pero cuando la respuesta se vuelve vacía, el análisis de json falla y se activa la devolución de llamada de error.
Mi solución fue anular el método de sync
del modelo:
var MyModel = Backbone.Model.extend({
// Fix for empty DELETE response
sync: function(method, model, options) {
if (method === ''delete'') {
options.dataType = ''html'';
}
Backbone.sync.call(this, method, model, options);
}
});
Esto funciona porque las options
se pasan a la llamada ajax
de jQuery y estamos indicando a jQuery que no espere a json.
Tuvo el mismo problema usando Backbone 1.5.3 con Rails. Probé la solución de Rudena, ¡y funciona!
Así es como se veía inicialmente la función de eliminación de mi controlador:
def destroy
@cell = current_user.cells.find(params[:id])
@cell.destroy
render :json => "success"
end
Y aquí está lo que funcionó:
def destroy
@cell = current_user.cells.find(params[:id])
@cell.destroy
render :json => @cell
end