Como faço para armazenar um contexto de usuário atual no AngularJS?

Eu tenho um AuthService, que faz o login em um usuário, ele retorna um object json do usuário. O que eu quero fazer é definir esse object e ter todas as alterações refletidas no aplicativo (estado conectado / desconectado) sem precisar atualizar a página.

Como eu conseguiria isso com o AngularJS?

A maneira mais fácil de conseguir 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 fazer referência a isso em qualquer um dos seus controladores. O código a seguir observa as alterações em um valor do serviço (chamando a function especificada) e, em seguida, sincroniza os valores alterados no 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 essa informação da maneira que achar melhor; 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!

Eu alteraria a boa resposta de Josh adicionando que, como um AuthService é tipicamente de interesse de alguém (digamos, qualquer pessoa, exceto a visão de login, deve desaparecer se ninguém estiver logado), talvez uma alternativa mais simples seria notificar as partes interessadas usando $rootScope.$broadcast('loginStatusChanged', isLoggedIn); (1) (2), enquanto partes interessadas (como controladores) ouviriam usando $scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; } .

(1) $rootScope sendo injetado como um argumento do serviço

(2) Note que, no caso provável de uma operação de login assíncrona, você vai querer notificar Angular que a transmissão irá mudar as coisas, incluindo-a em uma function $rootScope.$apply() .

Agora, falando em manter o contexto do usuário em cada / muitos controladores, você pode não ficar feliz em escutar alterações de login em todos eles, e pode preferir escutar apenas em um controlador de login mais alto, adicionando outros controladores com reconhecimento de login como filhos / controladores embutidos deste. Dessa forma, o controlador filho poderá ver as propriedades do escopo pai herdadas, como o contexto do usuário.