我有一个AuthService,它登录用户,它返回一个用户json对象。我想要做的是设置该对象并在应用程序(登录/注销状态)中反映所有更改,而无需刷新页面。
如何使用AngularJS完成此操作?
答案 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属性,例如您的用户上下文。