Backbone.Model.destroy не запускает функцию успеха при успешном завершении
Итак, в одном из моих представлений у меня есть эта функция:
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");
}
});
}
});
Когда я пингует, вызов Ajax гаснет, бэкэнд правильно удаляет модель и возвращает заголовок 200 с "ОК" в качестве тела... но событие успеха никогда не срабатывает. Я что-то упускаю? Что мне нужно, чтобы бэкэнд мог запустить это событие?
Ответы
Ответ 1
У меня была такая же проблема. Решение, которое работало для меня, состояло в том, чтобы убедиться, что я возвращаю json-модель с сервера, которая соответствует удаленной.
edit:, когда будет возвращен пустой ответ json.
Не работает:
delete(model) {
// deleted model from db
return "Model was deleted";
}
Это работало:
delete(model) {
// deleted model from db
return model;
}
или
delete(id) {
// deleted model from db with this id
return new Model {id: id};
}
Ответ 2
Имел ту же проблему, что и Backbone 1.5.3 с Rails. Я попробовал решение rudena, и он работает!
Здесь моя функция удаления контроллера выглядела как первоначально:
def destroy
@cell = current_user.cells.find(params[:id])
@cell.destroy
render :json => "success"
end
И вот что сработало:
def destroy
@cell = current_user.cells.find(params[:id])
@cell.destroy
render :json => @cell
end
Ответ 3
Это выглядит хорошо для меня, именно то, что у меня есть везде (кроме того, что у меня есть function(model)
, но это вообще не имеет значения). Я знаю, что более старые версии позвоночника не использовали destroy(options)
, а вместо этого имели destroy(success, failure)
. Можете ли вы убедиться, что у вас установлена последняя версия.
Ответ 4
Если бы эта проблема возникла и с моим пользовательским интерфейсом. На DELETE
API вернулся с пустым ответом 200
.
Что происходит, jQuery ожидает тело ответа json, но когда ответ возвращается пустым, json parsing терпит неудачу и обратный вызов ошибки запускается.
Моим решением было переопределить метод Model sync
:
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);
}
});
Это работает, потому что options
передается в вызов jQuery ajax
, и мы инструктируем jQuery не ожидать json.