Najprostszym sposobem na osiągnięcie tego celu jest skorzystanie 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 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();
});
});
Oczywiście, możesz użyć tych informacji, ale uznasz to za stosowne; na przykład w dyrektywach, szablonach itp. Możesz powtórzyć to (dostosowane do tego, co musisz zrobić) w kontrolerach menu, itp. Wszystko zostanie zaktualizowane automatycznie po zmianie stanu usługi.
Coś bardziej konkretnego zależy od implementacji.
Mam nadzieję, że to pomoże!
Tak też myślałem, ale jestem ciekawa, jak działa fabryka. Czy nie otrzymamy innego kontekstu currentUser za każdym razem, gdy tworzony jest kontroler i prosi o AuthService? Być może po prostu nie wiem, w jaki sposób Angular haczyka. Idealnie byśmy mieli jeden kontekst. Jako alternatywę myślałem o używaniu sklepu ngCookies (nie mój ulubiony pomysł) lub pamięci przeglądarki (nie jest to jeszcze dobrze obsługiwane). –
@ChrisNicola W rzeczywistości w AngularJS wszystkie usługi są singletons. Tak więc usługa jest tworzona po raz pierwszy, kiedy jest żądana (tj. Przez kontroler lub inną usługę), a wszystkie kolejne żądania jej zwracają dokładnie to samo wystąpienie. –
@JoshDavidMiller Masz właściwość 'isLoggedIn' jako funkcję? Czy to nie byłby boolean? – nicholas