Najłatwiej to osiągnąć, korzystając z usługi. Na przykład:
app.factory( 'AuthService', function() {
var currentUser;
return {
login: function() { ... },
logout: function() { ... },
isLoggedIn: function() { ... },
currentUser: function() { return currentUser; }
...
};
});
Możesz następnie odwołać się do tego w dowolnym ze swoich kontrolerów. Poniższy kod obserwuje zmiany wartości z usługi (przez wywołanie określonej funkcji), a następnie synchronizuje zmienione wartości z zakresem.
app.controller( 'MainCtrl', function( $scope, AuthService ) {
$scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
$scope.isLoggedIn = isLoggedIn;
$scope.currentUser = AuthService.currentUser();
});
});
Następnie możesz oczywiście wykorzystać te informacje w dowolny sposób; np. w dyrektywach, szablonach itp. Możesz to powtórzyć (dostosuj do tego, co musisz zrobić) w swoich kontrolerach menu itp. Wszystko to zostanie automatycznie zaktualizowane po zmianie stanu usługi.
Wszystko bardziej szczegółowe zależy od Twojej implementacji.
Mam nadzieję że to pomoże!
AuthService
. Pomaga to nie tylko w przypadku odświeżania strony, ale także dla osoby otwierającej łącze w nowej karcie.ui-router
) i rozwiązywanie tras są dobrym sposobem na utrzymanie kontroli uwierzytelniania w stanie SUCHYM. To, o czym napisałeś, brzmi dobrze.Poprawiłbym dobrą odpowiedź Josha, dodając, że ponieważ AuthService jest typowo interesujący dla każdego (powiedzmy, kogokolwiek poza widokiem logowania powinien zniknąć, jeśli nikt nie jest zalogowany), może prostszą alternatywą byłoby powiadomienie zainteresowanych stron za pomocą
$rootScope.$broadcast('loginStatusChanged', isLoggedIn);
(1 ) (2), podczas gdy zainteresowane strony (np. Kontrolerzy) nasłuchują przy użyciu$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }
.(1)
$rootScope
jest wstrzykiwany jako argument usługi(2) Zauważ, że w prawdopodobnym przypadku asynchronicznej operacji logowania będziesz chciał powiadomić Angular, że transmisja zmieni rzeczy, włączając ją do
$rootScope.$apply()
funkcji.Mówiąc o utrzymywaniu kontekstu użytkownika w każdym / wielu kontrolerach, możesz nie być zadowolony z nasłuchiwania zmian logowania we wszystkich z nich i może wolisz słuchać tylko w najwyższym kontrolerze logowania, a następnie dodać inne kontrolery obsługujące logowanie jako dzieci / wbudowane kontrolery tego. W ten sposób kontroler podrzędny będzie mógł zobaczyć odziedziczone właściwości nadrzędne $ scope, takie jak kontekst użytkownika.
źródło