Backbone Model.destroy () Вызывая функцию обратного вызова ошибки, даже если она работает нормально?

StackOverflow https://stackoverflow.com/questions/7305079

Вопрос

у меня есть Backbone.js Модель, которую я пытаюсь уничтожить, когда пользователь нажимает ссылку в представлении модели. Представление - что -то вроде этого (псевдокод, потому что он реализован в CoffeeScript который можно найти в нижней части вопроса).

var window.ListingSaveView = Backbone.View.extend({
  events: {
    'click a.delete': 'onDestroy'
  },

  onDestroy: function(event){
    event.preventDefault();
    this.model.destroy({
      success: function(model, response){
        console.log "Success";
      },
      error: function(model, response){
        console.log "Error";
      }
    });
  }
});

Когда я нажимаю delete ссылка в браузере, я всегда получаю Error Зарегистрировано в консоли, хотя мой сервер записывает успешное уничтожение соответствующей записи базы данных и возвращает 200 ответа. Когда я обновляю страницу (заставляя коллекцию повторно рендеринг из БД), модель, которую я удалила, исчезла.

Одна интересная, это то, что когда я регистрирую response В обратном вызове ошибки у него есть StatusCode 200 указывая на успех, но также сообщает statusText: "parseerror" Что бы это ни значило. В моих журналах сервера нет ошибок.

Что я делаю не так?

Это ответ с сервера:

  Object
    abort: function ( statusText ) {
    always: function () {
    complete: function () {
    done: function () {
    error: function () {
    fail: function () {
    getAllResponseHeaders: function () {
    getResponseHeader: function ( key ) {
    isRejected: function () {
    isResolved: function () {
    overrideMimeType: function ( type ) {
    pipe: function ( fnDone, fnFail ) {
    promise: function ( obj ) {
    readyState: 4
    responseText: " "
    setRequestHeader: function ( name, value ) {
    status: 200
    statusCode: function ( map ) {
    statusText: "parsererror"
    success: function () {
    then: function ( doneCallbacks, failCallbacks ) {
    __proto__: Object

Вот действие сервера, которое разрушает взаимодействие с (Ruby on Rails)

  # DELETE /team/listing_saves/1.json
  def destroy
    @save = current_user.team.listing_saves.find(params[:id])
    @save.destroy
    respond_to do |format|
      format.json { head :ok }
    end
  end

А вот и фактическая реализация кофейного представления для людей, которые предпочитают это так:

class MoveOutOrg.Views.ListingSaveView extends Backbone.View
  tagName: 'li'
  className: 'listing_save'
  template: JST['backbone/templates/listing_save']
  events:
    'click a.delete_saved': 'onDestroy'

  initialize: ->
    @model.bind 'change', this.render
  render: =>
    renderedContent = @template(@model.toJSON())
    $(@el).html(renderedContent)
    this
  onDestroy: (event) ->
    event.preventDefault() # stop the hash being added to the URL
    console.log "Listing Destroyed"
    @model.destroy
      success: (model, response)->
        console.log "Success"
        console.log model
        console.log response

      error: (model, response) ->
        console.log "Error"
        console.log model # this is the ListingSave model
        console.log response
Это было полезно?

Решение

@David Tuite Comment:

«Хорошо, я понял это. Похоже, что Backbone ожидает, что ответ JSON будет сериализацией JSON об уничтожении. @Listing_Save, где @Listing_Save - это запись, которую я только что уничтожил, и она регистрирует успех ».

К вашему сведению - когда вы делаете уничтожение, вам не нужно возвращать полный JSON для разрушенной модели. Вы можете вернуть пустой хэш JSON, и он будет работать просто отлично. Единственный раз, когда вам нужно вернуть JSON для модели, - это сохранение / обновление.

Другие советы

У меня была такая же проблема. В моем методе удаления на сервере (Java) я ничего не вернул. Просто статус 200/OK (или 204/без содержания). И поэтому проблема «parsererror» была вызвана тем, что JQuery попыталась преобразовать пустой ответ в JSON, который не удался (поскольку «JSON» является типом данных по умолчанию).

Мое решение было использовать вместо этого «текстовый» дат данных, который можно установить в параметрах:

model.destroy({ dataType: "text", success: function(model, response) {
  console.log("success");
}});

Ваш ответ должен иметь код состояния 204, поскольку вы не вернете никакого контента. Поскольку Backbone использует интерфейс REST, вы должны вернуть различные коды состояния HTTP в зависимости от задачи.

Вы уверены в своем URL? Вы добавляете .json В конце костяка. Модель URL? Поскольку вы проверяете это на своей стороне сервера (response_to do | format | ... end), вы не можете отправить правильно head :ok отклик

Попробуйте с этим destroy Метод рельсов, чтобы проверить, является ли это проблемой:

def destroy
  @save = current_user.team.listing_saves.find(params[:id])
  @save.destroy
  head :ok
end

Использование Slim Framework на сервере ламп вы можете добавить Статус ответа к УДАЛИТЬ Маршруты (или пользовательские маршруты, которые ничего не возвращают)

$app->response()->status(204);//204 No Content

Это также устанавливает тип контента обратно в текст/HTML, чтобы учесть пустое тело

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top