2011-08-08 17 views
16

Tak, w jednym z moich poglądów, mam tę funkcję:Backbone.Model.destroy nie wywołując funkcję sukces na sukces

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"); 
      } 
     }); 
    } 
}); 

Kiedy ping, że wywołanie Ajax zgaśnie, backend prawidłowo usuwa model i zwraca 200 nagłówka z "OK" jako treścią ... ale zdarzenie powodzenia nigdy się nie uruchamia. Czy czegoś brakuje? Co powinienem mieć backend, aby wystrzelić to wydarzenie?

+0

Może, tylko może treść odpowiedzi powinna być pusta. Zwróć tylko 200 kodów odpowiedzi. Tak to robię. Wierzę, że jeśli zwrócisz coś innego niż JSON, masz błąd szkieletu. I tylko dobrym nawykiem jest radzenie sobie z błędami. –

Odpowiedz

22

Po prostu miałem ten sam problem. Rozwiązaniem, które działało dla mnie, było upewnienie się, że zwrócę model json z serwera odpowiadającego usuniętemu.

edytuj: powróci pusta odpowiedź JSONA.

nie działa:

delete(model) { 
    // deleted model from db 
    return "Model was deleted"; 
} 

To nie praca:

delete(model) { 
    // deleted model from db 
    return model; 
} 

czyli

delete(id) { 
    // deleted model from db with this id 
    return new Model {id: id}; 

}

+3

Myślę, że powróciłby każdy JSON. Zwrócenie niczego poza JSON byłoby błędem. –

+0

Dzięki tak wiele poprawiono mój problem! – wilsonpage

+2

@ IvanIvanić tak nie jest. Jak wskazuje odpowiedź Zek, "render json:" success'' nadal zawodzi, jak również potwierdziłem. Minimalna robocza odpowiedź, którą znalazłem (dla Railsów), to 'render json: {}' (odpowiedź w powodzeniu wywołania zwrotnego to {}) lub 'render json: ''' (odpowiedź w powodzeniu zwrotnym ma wartość pustą) –

2

To wygląda dobrze mi dokładnie co mam wszędzie (z wyjątkiem mam function(model) jednak, że sprawa nie powinna w ogóle) Ja wiem, że starsze wersje szkieletu nie używać destroy(options) lecz miał destroy(success, failure). Czy możesz upewnić się, że masz najnowszą wersję?

+0

Dzięki za podpowiedź, ale wersja której używałam zdecydowanie miała pojedynczy argument 'options' - a przy nowszej wersji wciąż dostaję dziwne zachowanie. Nadal tego nie robiłem i robię coś z Mary, gdzie wysyłam DELETE i zakładam sukces (... tak, niedobrze - projekt wciąż znajduje się w fazie alfa). Wróci, gdy dojdę do sedna. – ltd

3

miał ten sam problem przy użyciu Backbone 1.5.3 z Szyny. Próbowałem rozwiązania firmy Rudena i działa!

Oto co funkcja kasowania mojego kontrolera wyglądało początkowo:

def destroy 
    @cell = current_user.cells.find(params[:id]) 
    @cell.destroy 

    render :json => "success" 
end 

A oto co pracował:

def destroy 
    @cell = current_user.cells.find(params[:id]) 
    @cell.destroy 

    render :json => @cell 
end 
+1

Ta odpowiedź jest specyficzna dla Rails, ale +1. – jhamm

0

miał ten problem wymyślić moim UI również. Po DELETE interfejs API wrócił z pustą odpowiedzią 200.

Co się dzieje, jQuery oczekuje ciała odpowiedzi JSON, ale kiedy odpowiedź wraca pusta, parsowanie JSON kończy się niepowodzeniem i wywoływane jest wywołanie zwrotne błędu.

Moje rozwiązanie było zastąpić model za sync metody:

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); 
    } 
}); 

To działa, ponieważ options jest przekazywane do jQuery ajax rozmowy i jesteśmy instruowanie jQuery nie oczekiwać JSON.

Powiązane problemy