2012-11-12 10 views
8

W mojej aplikacji opartej na Backbone.js mówię do mojego API, które odpowiada 401 w przypadku, gdy podstawowe żądanie zostało wykonane bez lub z nieważnym tokenem uwierzytelniania. Chciałbym to udowodnić, przechodząc na stronę #login, za każdym razem, gdy 401 jest odbierane.Howto cleanly fetch 401 w aplikacji opartej na Backbone.js

Aby pobrać 401 z powodzeniem owinąłem Backbone.sync, ale w tym momencie utknąłem. Próbowałem kilka strategii tutaj:

  1. throw 'unauthorized' w Backbone :: synchronizacji i spróbuj pobrać w moim routerze. Nie powiodło się: „Uncaught nieuprawnione”

  2. Próbując #.navigate '#login' w Backbone :: sync, który nie tylko wygląda dziwnie, ale przychodzi z problemem, że moja aplikacja jest oparte na AMD/require.js i po prostu nie mogę uzyskać dostępu do Backbone .Routeruj instancję w mojej opakowanej funkcji sync.

Jedynym rozwiązaniem widzę tak daleko byłoby stworzenie „dostępne globalnie” obiekt buforowania, że ​​Pobiera odwołanie do mojego routera instancji z kolei jest wprowadzane do define jako zależność gdzie jest to potrzebne. Ten obiekt pamięci podręcznej musiał być singletonem i zepsuł całą moją strategię "please-no-globals-and-no-namespaces".

Trochę utknąłem tutaj. Czy każdy może wskazać mi bardziej czyste rozwiązanie tego powszechnego problemu?

Odpowiedz

8

Można zrobić przekierowanie w ajaxError:

$.ajaxError(function (event, xhr) { 
      if (xhr.status == 401) 
       window.location = '#login'; 
     }); 

Jeśli wszystko jest ustawiony prawidłowo nie ma potrzeby, aby uzyskać dostęp do instancji routera ręcznie. Przejście do tego adresu URL powinno uruchomić powiązaną z nim funkcję trasy.

+0

Undestood. Mogłabym zrobić to samo window.location = ... w synchronizacji, gdzie pobieram tę odpowiedź. Dobry pomysł. Myślałem o czystym podejściu, musiałbym skorzystać z routera. Ale to brzmi jak dobre rozwiązanie. Dziękuję Anrei – GeorgieF

3

Dla tych z użyciem jQuery 1.8 lub wyższa, składnia się nie zmieniło:

$(document).ajaxError(function (event, xhr) { 
     if (xhr.status == 401) 
      window.location = '#login'; 
    }); 

Zobacz jQuery manual szczegóły.

+0

W [doc] (http://api.jquery.com/ajaxerror/) wspomniano, że jest od 1.9? –

Powiązane problemy