2013-08-07 10 views
6

Natknąłem się na Restangular, aby wykonywać połączenia z usługą odpoczynku. Działa wspaniale i zwraca obietnicę. Muszę mieć możliwość zablokowania połączenia. Powodem tego jest ponowne załadowanie nowej strony. Nie jestem technicznie loggowany, ale mogę mieć token zapisany w pliku cookie. Chciałbym sprawdzić token przeciwko usłudze odpoczynku. Problem polega na tym, że muszę go zablokować.AngularJS (Restangular): Tworzenie bloku obietnicy? Potrzebuję go użyć do sprawdzenia poprawności tokena

Jeśli wystąpi przekroczenie limitu czasu lub jego nieważne, że mogę traktować użytkownika jako nieautoryzowanego.

To jest powód, dla którego chce się blokować to, że chciałbym przekierować je za pomocą $ location.path na nowy adres URL, który nie jest prawidłowym tokenem.

Nie dotyczy to określonej trasy, więc nie mogę użyć rozwiązania, które blokuje. Technicznie dzieje się to na każdej trasie - korzystam z $ on. $ RouteChangeStart i sprawdzam wewnętrzną zmienną LoggedIn lub nie, jeśli nie jestem zalogowany, sprawdzam zapisany token.

Zdarza się to podczas odświeżania strony, ale nie podczas nawigacji w aplikacji.

Problemem, który próbuję uzyskać, jest działanie Gmaila.

czekamy na każdym nikogo Insight na tej

Dzięki

Odpowiedz

8

Zasadniczo należy upewnić się, że niektóre asynchroniczne działania mają miejsce przed wystąpieniem jakiejkolwiek zmiany trasy iw tym przypadku czynność polega na uwierzytelnieniu użytkownika.

Co możesz zrobić, to użyć zdarzenia $routeChangeStart który jest emitowany w celu dodać obiekt do obiektu resolve na trasie tak:

function authenticate() { 
    if (user.isAuthenticated) { 
     return; 
    } 
    // Just fake it, but in a real app this might be an ajax call or something 
    return $timeout(function() { 
     user.isAuthenticated = true; 
    }, 3000); 
} 

$rootScope.$on("$routeChangeStart", function(e, next) { 
    console.log("$routeChangeStart"); 
    next.resolve = angular.extend(next.resolve || {}, { 
     __authenticating__: authenticate 
    }); 
}); 

Ponieważ kątowa będzie czekać na wszelkich obietnic w obiekcie resolve do zostać spełnione przed kontynuowaniem, możesz po prostu użyć pseudo zależności, jak w przykładzie. Używając czegoś takiego, powinieneś być w stanie zagwarantować, że twój użytkownik uwierzytelnia się przed każdym pomyślnie wykonanym routingiem.

Przykład: http://jsfiddle.net/hLddM/

+0

Nice !, to było to, czego szukałem. – Martin

0

Myślę, że najlepszym sposobem na to może być, aby skłonić użytkownika dokoła z $ location.path, można użyć .then() aby skutecznie wymusić oczekiwanie, pozostawiając użytkownika na stronie ładującej.

var currentPath = $location.path(); 

$location.path(loadingScreen); 

//Assuming you have some sort of login function for ease. 
Restangular.login(token).then(
    function(result) { 
     $location.path(currentPath) 
    }, 
    function(error) { 
     $location.path(logInScreen) 
    } 
); 
+0

Dzięki Matt, który brzmiał jak to, co potrzebne, ale $ location.path (loadingScreen) zmieniłaby paska adresu przeglądarki. W każdym razie wokół tego? – Martin

0

Jeśli używasz UI-routera, można przenieść do innego państwa o tej samej zawartości, gdzie chcesz wykorzystać że Restangular.login z czym, w przypadku powodzenia wrócić do " zalogowany "stan, w przeciwnym razie przejdź do stanu" logowanie ", w którym użytkownik musi wprowadzić swoją nazwę użytkownika i hasło.

Jeśli nie używasz routery-ui, możesz zaimplementować coś takiego z numerem ng-switch.

Po przybyciu na ekran robisz to Restangular.login i domyślnie wyświetlasz stronę ładowania, ustawiając wartość boolean na true. Następnie, jeśli się nie uda, wyślesz go na login, w przeciwnym razie ustawisz ładowanie na wartość false i wyświetl stronę.

W każdym razie, ja zdecydowanie zalecamy używanie UI-routera, to skały :)

nadzieję, że to działa!

Powiązane problemy