Подтвердить что ты не робот

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 с "ОК" в качестве тела... но событие успеха никогда не срабатывает. Я что-то упускаю? Что мне нужно, чтобы бэкэнд мог запустить это событие?

4b9b3361

Ответ 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.