Answers:
实现此目的的最简单方法是使用服务。例如:
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();
});
});
然后,当然可以使用您认为合适的信息;例如,在指令,模板等中。您可以在菜单控制器等中重复此操作(根据您需要执行的操作)。更改服务状态时,所有这些都将自动更新。
任何更具体的内容都取决于您的实现。
希望这可以帮助!
AuthService
。这不仅有助于刷新页面,而且还有助于在新标签页中打开链接的人。
ui-router
)和路由解析是使auth控件保持DRY的好方法。你写的东西听起来不错。
我要补充一下Josh的良好回应,因为AuthService通常是任何人都感兴趣的(例如,如果没有人登录,则登录视图之外的任何人都应该消失),也许更简单的选择是使用$rootScope.$broadcast('loginStatusChanged', isLoggedIn);
(1 )(2),而相关方(例如控制者)会使用收听$scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }
。
(1)$rootScope
作为服务的论点被注入
(2)请注意,在异步登录操作的可能情况下,您需要通过将Angular包含在$rootScope.$apply()
函数中来通知Angular广播将改变事物。
现在,谈到在每个控制器中保留用户上下文,您可能不愿意在每个控制器中监听登录更改,并且可能更喜欢仅在最顶层的登录控制器中监听,然后将其他可识别登录的控制器添加为子控件/嵌入式控制器。这样,子级控制器将能够看到继承的父级$ scope属性,例如您的用户上下文。