我有一个AuthService,它登录用户,返回一个用户json对象,我想做的是设置该对象,并使所有更改反映在整个应用程序中(登录/注销状态),而不必刷新页面。我如何使用AngularJS实现这一点?
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(); }); });
然后,当然,你可以用你认为合适的方式使用这些信息;例如,在指令、模板等中。您可以在菜单控制器等中重复此操作(根据需要进行定制)。当您更改服务状态时,所有这些操作都会自动更新。更具体的内容取决于您的实现。
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属性,例如您的用户上下文。
$rootScope.$broadcast('loginStatusChanged', isLoggedIn);
$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }
$rootScope
$rootScope.$apply()
2条答案
按热度按时间7gcisfzg1#
完成此操作的最简单方法是使用服务。例如:
然后你可以在你的任何控制器中引用它。下面的代码监视来自服务的值的变化(通过调用指定的函数),然后将变化的值同步到作用域。
然后,当然,你可以用你认为合适的方式使用这些信息;例如,在指令、模板等中。您可以在菜单控制器等中重复此操作(根据需要进行定制)。当您更改服务状态时,所有这些操作都会自动更新。
更具体的内容取决于您的实现。
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属性,例如您的用户上下文。