2016-06-09 31 views
0

比方说,我有一个可变的标志叫is_logged_in,我希望它是在范围上我的所有控制器怎么办。因此,如果我的应用程序的每个页面上都有{{is_logged_in}},则会将其打印出来。

如何做到这一点,而无需编写重复这样的代码,在我所有的控制器:

function MyCtrl($scope, IsLoggedInService) { 
$scope.is_logged_in = IsLoggedInService.IsLoggedIn(); 
} 

回答

0

最好的办法是使用$rootScope。顾名思义,这与您的应用程序的根范围相对应,因此可能(通过DI)在您的任何控制器中可用。所有你需要做的就是添加$rootScope在每个控制器的DI依赖需要它:

function MyCtrl($scope, $rootScope { 
    $rootScope... 
} 

在你的模板中,$rootScope总是可以通过在角度表达引用$root

你会做这样的事情:

<p>{{$root.is_logged_in}}</p> 
+0

这个工作的感谢!虽然我将整合一些mavim的答案仅登录页面 – beansontoast

0

改成这样:

$rootScope.is_logged_in = IsLoggedInService.IsLoggedIn(); 
-1

另一种方法,但使用$ 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

+0

为了正确工作,控制器从广播到完成的地方应该同时处于活动状态,因为它只是一个事件监听器 –

0

或不 我认为您的问题,正确的方法是在路由使用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

相关问题