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

Art*_*Art 91 angularjs

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

我如何使用AngularJS实现这一目标?

Jos*_*ler 180

完成此任务的最简单方法是使用服务.例如:

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

  return {
    login: function() { ... },
    logout: function() { ... },
    isLoggedIn: function() { ... },
    currentUser: function() { return currentUser; }
    ...
  };
});
Run Code Online (Sandbox Code Playgroud)

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

app.controller( 'MainCtrl', function( $scope, AuthService ) {
  $scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
    $scope.isLoggedIn = isLoggedIn;
    $scope.currentUser = AuthService.currentUser();
  });
});
Run Code Online (Sandbox Code Playgroud)

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

更具体的取决于您的实施.

希望这可以帮助!

  • @ChrisNicola实际上,在AngularJS中,所有服务都是单身人士.因此,服务是在第一次请求时(即通过控制器或其他服务)创建的,并且所有后续请求都返回完全相同的实例. (28认同)
  • @Tomba这是一个很好的问题.:-)确实信息在刷新时丢失了.通常,您需要将*某些*会话信息存储在cookie中.设置`AuthService`时也可以检查该会话信息.这不仅有助于页面刷新,还有助于在新选项卡中打开链接的人员. (10认同)
  • 这可能是一个愚蠢的问题......但是如果用户刷新页面会发生什么 - 登录信息丢失了吗? (7认同)
  • 它可能是,但作为一个功能,我们可以删除我们如何将这些信息从公共API存储到私有API的内部.这使得后面的重构变得更加容易.但该函数仍将*返回一个布尔值. (2认同)
  • @PixMach你对学习曲线100%正确.你的问题将取决于很多具体案例,但这里有一些一般模式.保持关注点分离:与启动登录相关的UI与auth本身是分开的,auth本身与auth的状态是分开的,auth的状态与可能取决于所述状态的任何菜单是分开的.导航/菜单通常最好由单个控制器处理,嵌套状态(一个"ui-router")和路由解析是保持auth控制DRY的好方法.你所写的内容听起来是正确的. (2认同)

Jav*_*ome 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属性,例如您的用户上下文.

  • 对工厂功能的错误解释进行了低估.这个误解已经在你的[本评论](http://stackoverflow.com/questions/14206492/how-do-i-store-a-current-user-context-in-angular/14206567#comment20831205_14206567)中提到了几个月发布了你的答案. (4认同)