AngularJS-从控制器获取模块常量


72

我试图建立一个myApp.config模块来存储我的应用程序的一些设置,我写了一个config.js文件:

angular.module('myApp.config', [])
    .constant('APP_NAME','My Angular App!')
    .constant('APP_VERSION','0.3');

我将其添加到我的app.js(角种子)中:

angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers', 'myApp.config']).

我将其添加到index.html文件,现在我试图弄清楚如何在控制器中获取它,我尝试了:

angular.module('myApp.controllers', ['myApp.config'])
  .controller('ListCtrl', ['$scope', 'myApp.config', function($scope, $config) {
    $scope.printme = $config;
  }])

但我得到:

未知提供者:myApp.configProvider <-m​​yApp.config

我在这里做错什么了,有什么主意吗?


在Asaf中,您尝试将模块作为依赖项注入到控制器中,这将不起作用。一个模块只能是另一个模块的依赖项。
Shivam

Answers:


88

我认为在这样的注入中使用模块名称是无效的。不过,您可以按名称简单地注入常量:

angular.module('myApp.controllers', ['myApp.config'])
  .controller('ListCtrl', ['$scope', 'APP_NAME', function($scope, appName) {
     $scope.printme = appName;
}]);

4
正确,有一个全局依赖项注入空间,一旦.constant在任何模块中设置,就可以将值注入其他任何地方。
jpsimons 2013年

6
在Angular中使用配置文件(用于可自定义设置)通常是一种明智的方法吗?
Asaf 2013年

@Asaf可以使用以下.constant服务。angular.module('app').constant('appSettings', { version: '1.0', appName: 'myApp'});然后将其注入控制器或.config或任何您想要的文件angular.module('app').controller('simpleCtrl', ['appSettings', function(appSettings) { $scope.valueInIsolatedScope = appSettings.version; }])
hastrb

73

我认为最简单的方法是使用对象文字添加常量。这适合我认为的大多数应用程序配置用例,因为它支持复杂的config对象。该constant步骤还可以注册其他提供程序之前尽早运行。

angular.module('myApp').constant('cfg', {
  url: 'https://myapi.com/v1/',
  httpTimeout: 5000
})

要使用它,您只需注入cfg

angular.module('myApp').factory('user', function(cfg, $http){
  // cfg and $http together at last
})

正是我想要的!
Devner '16

我有一个常量提供程序,其中包含用于导航的键代码,我想将常量提供程序注入到控制器中(我想避免分别注入每个条目)。那可能吗?我已经注入了其他一些服务。
owczarek's

是否比:angular.module('myApp').constant('keyCodes', { left: 36, right: 38 })'和:更难angular.module('myApp').factory('myComponent', function(keyCodes) { keyCodes.left })
SimplGy

5

还应该注意的是,SimplGy的解决方案意味着“ cfg”对象是一个常数,但是该对象的属性不是。这意味着您不能像这样重新分配“ cfg”:

cfg = { randomProperty: randomValue };

您可以像下面这样重新分配'cfg'对象的属性:

cfg.url = 'BrandNewURL.com';
cfg.httpTimeout = 30;

1
这不能回答问题。对其他答案的答复应写为评论。
肯·韦恩·范德林德'16

1
@KenWayneVanderLinde抱歉,肯。不幸的是,我还没有收集到足够多的评论来发表评论,但是我认为对于作者而言,意识到使用Angulars“ Constant”可能发生的问题非常重要。
马特M

1
@MattM我认为你很好。将所有这些内容都放入评论中是不可能的。
卡门主义

3

在此示例中检查常量的使用:

angular
.module('abp001App', ['ngRoute'])
.constant("myConfig", {
    "url": "http://localhost",
    "port": "80"
})
.config(function ($routeProvider) {
    $routeProvider
        .when('/', {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        })
        .otherwise({
            redirectTo: '/'
        });
})
.controller('MainCtrl', function (myConfig) {
    // Do something with myConfig...
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.