Angularjs 如何在所有控制器的$scope中放置变量

Angularjs 如何在所有控制器的$scope中放置变量,angularjs,Angularjs,假设我有一个名为is_logged_in的变量标志,我希望它在我所有控制器的作用域中。因此,如果我在应用程序的每个页面上都有{{is_logged_in}},它就会打印出来 如何在我的所有控制器中实现此而不编写类似这样的重复代码: function MyCtrl($scope, IsLoggedInService) { $scope.is_logged_in = IsLoggedInService.IsLoggedIn(); } 更改为: $rootScope.is_logged_in = I

假设我有一个名为is_logged_in的变量标志,我希望它在我所有控制器的作用域中。因此,如果我在应用程序的每个页面上都有{{is_logged_in}},它就会打印出来

如何在我的所有控制器中实现此而不编写类似这样的重复代码

function MyCtrl($scope, IsLoggedInService) {
$scope.is_logged_in = IsLoggedInService.IsLoggedIn();
}
更改为:

$rootScope.is_logged_in = IsLoggedInService.IsLoggedIn();

您最好使用
$rootScope
。顾名思义,这对应于应用程序的根范围,因此在任何控制器中都可能(通过DI)可用。您只需在每个需要它的控制器中添加
$rootScope
作为DI依赖项:

function MyCtrl($scope, $rootScope {
  $rootScope...
}
在模板中,
$rootScope
始终通过在角度表达式中引用
$root
可用

您可以这样做:

<p>{{$root.is_logged_in}}</p>
$rootScope.$broadcast('user_logged_in');
{{$root.is\u logged\u in}


另一种使用$rootScope的方法是使用$broadcast为该变量创建观察者

为此,当此变量更改时,您应该广播一个事件,如下所示:

<p>{{$root.is_logged_in}}</p>
$rootScope.$broadcast('user_logged_in');
然后,使用$on方法观看它。在这里:

$scope.$on('user_logged_in', function(event, args) {
    // here you do what you want, like:
    $scope.logged_in = true;
});
如果您想了解更多信息,angular还提供了$emmit方法,当您希望范围高于您的范围时,可以使用该方法来侦听该事件。(你可以在这里找到更多信息:


但是,如果您想检查用户是否登录,您应该在文档中阅读更多信息,这里是:

我认为解决问题的正确方法是在路由中使用resolve属性,这样,如果用户未登录,就无法导航到某些页面,一旦用户登录,就可以将用户对象注入控制器

例如,要导航到主页,您必须登录

.when("/home", {
templateUrl: "homeView.html",
controller: "homeController",
resolve: {
    user: function(AuthenticationService){
        return AuthenticationService.getUser();
    }
  }
})

app.controller("homeController", function ($scope, user) {
  $scope.user = user;
});


如果您只需要一个全局变量,您可以使用$rootScope

使其正常工作,从广播开始到接收广播的两个控制器应该同时处于活动状态,因为它只是一个事件监听器。这很有效,谢谢!不过我将结合一些mavim的答案,用于仅登录的页面