Respostas:
A maneira mais fácil de fazer isso é usando um serviço. Por exemplo:
app.factory( 'AuthService', function() {
var currentUser;
return {
login: function() { ... },
logout: function() { ... },
isLoggedIn: function() { ... },
currentUser: function() { return currentUser; }
...
};
});
Você pode então fazer referência a isso em qualquer um de seus controladores. O código a seguir observa as alterações em um valor do serviço (chamando a função especificada) e, em seguida, sincroniza os valores alterados com o escopo.
app.controller( 'MainCtrl', function( $scope, AuthService ) {
$scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
$scope.isLoggedIn = isLoggedIn;
$scope.currentUser = AuthService.currentUser();
});
});
E então, é claro, você pode usar essas informações da maneira que achar necessário; por exemplo, em diretivas, em modelos, etc. Você pode repetir isso (personalizado para o que você precisa fazer) em seus controladores de menu, etc. Tudo será atualizado automaticamente quando você alterar o estado no serviço.
Qualquer coisa mais específica depende da sua implementação.
Espero que isto ajude!
AuthService. Isso ajuda não apenas para atualizações de página, mas para alguém abrindo um link em uma nova guia.
ui-router) e resoluções de rota são uma boa maneira de manter os controles de autenticação DRY. O que você escreveu parece certo.
Eu corrigiria a boa resposta de Josh acrescentando que, como um AuthService é tipicamente do interesse de qualquer pessoa (digamos, qualquer um, exceto a visualização de login deve desaparecer se ninguém estiver conectado), talvez uma alternativa mais simples seja notificar as partes interessadas usando $rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1 ) (2), enquanto as partes interessadas (como controladores) ouviriam usando $scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }.
(1) $rootScopesendo injetado como um argumento do serviço
(2) Observe que, no caso provável de uma operação de login assíncrona, você desejará notificar o Angular que a transmissão mudará as coisas, incluindo-o em uma $rootScope.$apply()função.
Agora, por falar em manter o contexto do usuário em todos / muitos controladores, você pode não gostar de ouvir as alterações de login em todos eles e pode preferir ouvir apenas em um controlador de login superior, adicionando então outros controladores com reconhecimento de login como filhos / controladores embutidos deste. Dessa forma, o controlador filho será capaz de ver as propriedades herdadas do parent $ scope, como o contexto do usuário.