我有一个问题,我在控制器的范围上初始化一个变量。然后当用户登录时,它在另一个控制器中被更改。该变量用于控制导航栏等内容,并根据用户类型限制对站点部分内容的访问,因此保持其值很重要。它的问题是,初始化它的控制器,被angular以某种方式再次调用,然后将变量重置回初始值。

我认为这不是声明和初始化全局变量的正确方式,好吧,它并不是真正的全局,所以我的问题是,正确的方式是什么?有没有什么好的例子可以在当前版本的angular中使用?


当前回答

如果我说错了,请指正,但当Angular 2.0发布时,我不相信$rootScope会出现。我的猜想是基于$scope也被删除的事实。显然,控制器仍然会存在,只是不是以ng-controller的方式。可以考虑将控制器注入到指令中。由于即将发布,如果您想更容易地从版本1切换到版本1,最好将服务用作全局变量。X到2.0。

其他回答

你也可以这样做。

function MyCtrl1($scope) {
    $rootScope.$root.name = 'anonymous'; 
}

function MyCtrl2($scope) {
    var name = $rootScope.$root.name;
}
// app.js or break it up into seperate files
// whatever structure is your flavor    
angular.module('myApp', [])    

.constant('CONFIG', {
    'APP_NAME' : 'My Awesome App',
    'APP_VERSION' : '0.0.0',
    'GOOGLE_ANALYTICS_ID' : '',
    'BASE_URL' : '',
    'SYSTEM_LANGUAGE' : ''
})

.controller('GlobalVarController', ['$scope', 'CONFIG', function($scope, CONFIG) {

    // If you wish to show the CONFIG vars in the console:
    console.log(CONFIG);

    // And your CONFIG vars in .constant will be passed to the HTML doc with this:
    $scope.config = CONFIG;
}]);

在你的HTML中:

<span ng-controller="GlobalVarController">{{config.APP_NAME}} | v{{config.APP_VERSION}}</span>
localStorage.username = 'blah'

如果你用的是现代浏览器的话。尽管知道你的值都将被转换成字符串。

也有方便的好处被缓存之间重新加载。

为了给维基池添加另一个想法,那么AngularJS的value和constant模块呢?我自己才刚刚开始使用它们,但对我来说,这些可能是最好的选择。

注意:在撰写本文时,Angular 1.3.7是最新的稳定版本,我相信这些都是在1.2.0中添加的,不过还没有在更新日志中确认这一点。

根据需要定义的数量,您可能需要为它们创建一个单独的文件。但我通常在我的应用程序的.config()块之前定义这些,以便于访问。因为这些仍然是有效的模块,你需要依赖依赖注入来使用它们,但它们对你的应用模块来说是“全局的”。

例如:

angular.module('myApp', [])
  .value('debug', true)
  .constant('ENVIRONMENT', 'development')
  .config({...})

然后在任何控制器内部:

angular.module('myApp')
  .controller('MainCtrl', function(debug, ENVIRONMENT), {
    // here you can access `debug` and `ENVIRONMENT` as straight variables
  })

从最初的问题,实际上听起来像静态属性在这里是必需的,无论是可变(值)或final(常量)。这更多的是我个人的观点,但我发现将运行时配置项放在$rootScope上太乱了,太快了。

AngularJS使用$rootScope创建全局变量的例子:

控制器1设置全局变量:

function MyCtrl1($scope, $rootScope) {
    $rootScope.name = 'anonymous'; 
}

控制器2读取全局变量:

function MyCtrl2($scope, $rootScope) {
    $scope.name2 = $rootScope.name; 
}

这是一个工作的jsFiddle: http://jsfiddle.net/natefriedman/3XT3F/1/