underscore source examples backbone annotated backbone.js

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