如何在AngularJS中存储当前用户上下文?

时间:2013-01-08 00:32:36

标签: angularjs

我有一个AuthService,它登录用户,它返回一个用户json对象。我想要做的是设置该对象并在应用程序(登录/注销状态)中反映所有更改,而无需刷新页面。

如何使用AngularJS完成此操作?

2 个答案:

答案 0 :(得分:179)

实现此目的的最简单方法是使用服务。例如:

app.factory( 'AuthService', function() {
  var currentUser;

  return {
    login: function() { ... },
    logout: function() { ... },
    isLoggedIn: function() { ... },
    currentUser: function() { return currentUser; }
    ...
  };
});

然后,您可以在任何控制器中引用它。以下代码监视服务中值的更改(通过调用指定的函数),然后将更改的值同步到范围。

app.controller( 'MainCtrl', function( $scope, AuthService ) {
  $scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
    $scope.isLoggedIn = isLoggedIn;
    $scope.currentUser = AuthService.currentUser();
  });
});

然后,当然,您可以使用您认为合适的信息;例如在指令,模板等中。您可以在菜单控制器等中重复此操作(根据您的需要进行自定义)。当您更改服务状态时,它将自动更新。

任何更具体的内容取决于您的实施。

希望这有帮助!

答案 1 :(得分:5)

我会修改Josh的良好反应,补充一点,因为AuthService通常是任何人都感兴趣的(比如,除了登录视图之外的任何人都应该在没有人登录的情况下消失),也许更简单的替代方案是通知感兴趣的各方使用$rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1)(2),而感兴趣的各方(如控制器)将使用$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }收听。

(1)$rootScope被注入作为服务的参数

(2)请注意,在异步登录操作的可能情况下,您需要通过将其包含在$rootScope.$apply()函数中来通知Angular广播将改变事物。

现在,谈到在每个/多个控制器中保留用户上下文,您可能不乐意在每个控制器中监听登录更改,并且可能更愿意仅在最顶层的登录控制器中侦听,然后添加其他登录感知控制器作为这个孩子/嵌入式控制器。这样,子控制器将能够看到继承的父$ scope属性,例如您的用户上下文。