Załóżmy, że mam 4 trasy - 2 wymagają zalogowania użytkownika, 2 nie. Moja aplikacja startowych wygląda następująco:Jak sprawdzić logowanie lub inny status przed uruchomieniem trasy w Angular z routeProvider?
$routeProvider.when('/open1',{templateUrl:'/open1.html',controller:'Open1'});
$routeProvider.when('/open2',{templateUrl:'/open2.html',controller:'Open2'});
$routeProvider.when('/secure1',{templateUrl:'/secure1.html',controller:'Secure1'});
$routeProvider.when('/secure2',{templateUrl:'/secure2.html',controller:'Secure2'});
Trasy /open1
/open2
i są otwarte dla wszystkich, podczas trasy /secure1
i /secure2
wymagać od użytkownika, aby zalogować się, a jeśli nie, podjąć pewne działania, na przykład przekieruj do logowania lub uruchom ostrzeżenie. Mogę określić stan użytkownika za pomocą usługi i wywołania Auth
, np. Auth.isLogin()
. Więc wynik będzie:
- zamiar
/open1
i/open2
zawsze iść do szablonu i kontrolera deklarowanej powyżej - jeśli
Auth.isLogin()
zwraca true,/secure1
i/secure2
iść do wyżej zadeklarowana szablonu i kontrolera - jeśli
Auth.isLogin()
zwraca false,/secure1
i/secure2
wykonaj inne czynności, np.$location.path('/login')
I mógłby put logikę w Secure1
i Secure2
kontrolerów, która sprawdza, ale to jest powtarzalne i miesza się obowiązków, sprawia, że trudniej testować itp
Czy istnieje sposób, że mogę użyj $routeProvider
, aby zadeklarować "sprawdź tę trasę i tę trasę, a jeśli nie, przekieruj"? Myślałem o użyciu w pewnym sensie resolve
, ale nie jestem do końca pewien, jak to zrobić (dokumenty na temat resolve
nie są bardzo jasne i kilka pomocnych przykładów).
EDIT:
na podstawie poniższych odpowiedzi, wydaje się, istnieją trzy filozofie w ten sposób:
- Korzystanie
resolve
sprawdzić zalogowany i nie obietnicę, a następnie połowu zdarzenie$routeChangeError
do przekierowanie http://www.sitepoint.com/implementing-authentication-angular-applications/ - Korzystanie tylko
$routeChangeStart
imprezę, by sprawdzić zalogowany i przekierować http://arthur.gonigberg.com/2013/06/29/angularjs-role-based-auth/ - Korzystanie prostu rozwiązać, by sprawdzić rejestrowane i n i przekierowanie http://midgetontoes.com/blog/2014/08/31/angularjs-check-user-login
Druga opcja jest tym, co zasugerowali ci dwaj respondenci.
Czy możesz wspomnieć, gdzie umieścić var onlyLoggedIn, jak w jakim zakresie? Jestem dla niego bardzo nowy. @deitch –
@AayushKumarSingha Właśnie ogłaszam, że jest to funkcja zmiennej lokalnej w moim app.js, a następnie odwołuję ją do mojego '$ routeProvider'. Ale może być w dowolnym miejscu, ponieważ zawsze można "wymagać()" lub w inny sposób go zawrzeć. – deitch
Twój adres URL jest już martwy. – Denny