我有一个问题,我在控制器的范围上初始化一个变量。然后当用户登录时,它在另一个控制器中被更改。该变量用于控制导航栏等内容,并根据用户类型限制对站点部分内容的访问,因此保持其值很重要。它的问题是,初始化它的控制器,被angular以某种方式再次调用,然后将变量重置回初始值。
我认为这不是声明和初始化全局变量的正确方式,好吧,它并不是真正的全局,所以我的问题是,正确的方式是什么?有没有什么好的例子可以在当前版本的angular中使用?
我有一个问题,我在控制器的范围上初始化一个变量。然后当用户登录时,它在另一个控制器中被更改。该变量用于控制导航栏等内容,并根据用户类型限制对站点部分内容的访问,因此保持其值很重要。它的问题是,初始化它的控制器,被angular以某种方式再次调用,然后将变量重置回初始值。
我认为这不是声明和初始化全局变量的正确方式,好吧,它并不是真正的全局,所以我的问题是,正确的方式是什么?有没有什么好的例子可以在当前版本的angular中使用?
当前回答
为了给维基池添加另一个想法,那么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的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上太乱了,太快了。
尝试一下,你不会强制在控制器中注入$rootScope。
app.run(function($rootScope) {
$rootScope.Currency = 'USD';
});
你只能在运行块中使用它,因为配置块不会提供给你使用$rootScope服务。
你也可以这样做。
function MyCtrl1($scope) {
$rootScope.$root.name = 'anonymous';
}
function MyCtrl2($scope) {
var name = $rootScope.$root.name;
}
如果你只是想存储一个值,根据Angular的Providers文档,你应该使用value recipe:
var myApp = angular.module('myApp', []);
myApp.value('clientId', 'a12345654321x');
然后像这样在控制器中使用它:
myApp.controller('DemoController', ['clientId', function DemoController(clientId) {
this.clientId = clientId;
}]);
使用提供者、工厂或服务也可以达到同样的效果,因为它们“只是提供者菜谱上的语法糖”,但使用值可以用最少的语法实现您想要的效果。
另一个选项是使用$rootScope,但这不是一个真正的选项,因为你不应该使用它,因为同样的原因,你不应该在其他语言中使用全局变量。建议有节制地使用。
因为所有作用域都继承自$rootScope,如果你有一个变量$rootScope。数据,有人忘记了数据已经定义并创建$scope。本地范围内的数据将会遇到问题。
如果你想修改这个值并让它在你的所有控制器上保持不变,请使用一个对象并修改属性,记住Javascript是通过“引用的副本”传递的:
myApp.value('clientId', { value: 'a12345654321x' });
myApp.controller('DemoController', ['clientId', function DemoController(clientId) {
this.clientId = clientId;
this.change = function(value) {
clientId.value = 'something else';
}
}];
JSFiddle例子
我只是无意中发现了另一个方法:
我所做的是在app声明上面声明一个var db = null,然后在app.js中修改它,然后当我在controller.js中访问它 我可以毫无问题地访问它。这种方法可能有一些问题,我不知道,但我想这是一个很好的解决方案。