比方说,我有一个可变的标志叫is_logged_in,我希望它是在范围上我的所有控制器怎么办。因此,如果我的应用程序的每个页面上都有{{is_logged_in}},则会将其打印出来。
如何做到这一点,而无需编写重复这样的代码,在我所有的控制器:
function MyCtrl($scope, IsLoggedInService) {
$scope.is_logged_in = IsLoggedInService.IsLoggedIn();
}
比方说,我有一个可变的标志叫is_logged_in,我希望它是在范围上我的所有控制器怎么办。因此,如果我的应用程序的每个页面上都有{{is_logged_in}},则会将其打印出来。
如何做到这一点,而无需编写重复这样的代码,在我所有的控制器:
function MyCtrl($scope, IsLoggedInService) {
$scope.is_logged_in = IsLoggedInService.IsLoggedIn();
}
最好的办法是使用$rootScope
。顾名思义,这与您的应用程序的根范围相对应,因此可能(通过DI)在您的任何控制器中可用。所有你需要做的就是添加$rootScope
在每个控制器的DI依赖需要它:
function MyCtrl($scope, $rootScope {
$rootScope...
}
在你的模板中,$rootScope
总是可以通过在角度表达引用$root
。
你会做这样的事情:
<p>{{$root.is_logged_in}}</p>
改成这样:
$rootScope.is_logged_in = IsLoggedInService.IsLoggedIn();
另一种方法,但使用$ rootScope,就是用$广播创建该变量的观察员。
为了做到这一点,你什么时候这个变量改变,这应该播送活动:
$rootScope.$broadcast('user_logged_in');
,然后使用方法上的$观看。在这里:
$scope.$on('user_logged_in', function(event, args) {
// here you do what you want, like:
$scope.logged_in = true;
});
如果你想知道更多一点,角度也提供了$ emmit方法,用来当你想,上面你的范围收听该事件。 (你可以找到更多在这里:$rootScope.$broadcast vs. $scope.$emit
然而,你应该在文档,What are scopes?这里阅读更多关于:如果您想查询的用户是否登录$rootScope.Scope
为了正确工作,控制器从广播到完成的地方应该同时处于活动状态,因为它只是一个事件监听器 –
或不 我认为您的问题,正确的方法是在路由使用resolve属性,所以如果他没有登录用户无法浏览某些网页,一旦他在你登录可以注入的用户对象控制器
例如导航到主页,您必须登录
.when("/home", {
templateUrl: "homeView.html",
controller: "homeController",
resolve: {
user: function(AuthenticationService){
return AuthenticationService.getUser();
}
}
})
app.controller("homeController", function ($scope, user) {
$scope.user = user;
});
https://www.sitepoint.com/implementing-authentication-angular-applications/
,如果你只是想要一个全局变量,可以使用$ rootScope
这个工作的感谢!虽然我将整合一些mavim的答案仅登录页面 – beansontoast