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

fjaof16o  于 2022-12-26  发布在  Angular
关注(0)|答案(2)|浏览(135)

我有一个AuthService,它登录用户,返回一个用户json对象,我想做的是设置该对象,并使所有更改反映在整个应用程序中(登录/注销状态),而不必刷新页面。
我如何使用AngularJS实现这一点?

7gcisfzg

7gcisfzg1#

完成此操作的最简单方法是使用服务。例如:

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();
  });
});

然后,当然,你可以用你认为合适的方式使用这些信息;例如,在指令、模板等中。您可以在菜单控制器等中重复此操作(根据需要进行定制)。当您更改服务状态时,所有这些操作都会自动更新。
更具体的内容取决于您的实现。

k3fezbri

k3fezbri2#

我想补充一下Josh的回答,因为AuthService通常是任何人都感兴趣的(比如说,如果没有人登录,除了登录视图之外的任何人都应该消失),也许更简单的替代方法是使用$rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1)(2)通知感兴趣的各方,而感兴趣的各方(比如控制器)将使用$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }侦听。
(1)$rootScope作为服务的参数注入
(2)注意,在异步登录操作的可能情况下,您需要通知Angular广播将改变一些事情,方法是将广播包含在$rootScope.$apply()函数中。
现在,说到在每个/多个控制器中保持用户上下文,您可能不喜欢监听每个控制器中的登录更改,而可能更喜欢只监听最顶层的登录控制器,然后添加其他登录感知控制器作为这个控制器的子/嵌入式控制器。这样,子控制器将能够看到继承的父$scope属性,例如您的用户上下文。

相关问题