如何在angular中将依赖注入到module.config(configFn)中

Fre*_*ang 74 angularjs

-在角度,我们可以注入$routeProviderconfig功能

module.config(function ($routeProvider) {


});
Run Code Online (Sandbox Code Playgroud)

我想把我的服务注入其中

module.config(function ($routeProvider, myService) {


});
Run Code Online (Sandbox Code Playgroud)

我确信该服务已正确定义,但它会抛出一个异常unknown myService,说明当我注入时的事件

module.config(function ($routeProvider, $http) {


});
Run Code Online (Sandbox Code Playgroud)

它仍然说unknown $http.

你知道为什么吗?

Mar*_*cok 95

模块页面,"模块加载和依赖关系"部分:

配置块 - 在提供程序注册和配置阶段执行.只有提供程序和常量才能注入配置块.这是为了防止在完全配置服务之前意外实例化服务.

运行块 - 在创建注入器后执行并用于启动应用程序.只有实例和常量才能注入运行块.这是为了防止在应用程序运行时进一步进行系统配置.

因此,您无法将自己的服务或内置服务(如$ http)注入config().请改用run().

  • 如上所述,任何"提供者"(Angular内置或您自己的)或"常量"都可以注入config()函数.下面是一些包含内置提供程序的Angular源代码:https://github.com/angular/angular.js/blob/79b51d5b578927bd510123c81953e7cc8c72f211/src/AngularPublic.js (2认同)

Jon*_*bbe 56

我没有足够的声誉发表评论,但想补充马克的答案.

您可以自己注册提供商.它们基本上是带有$get方法的对象(或构造函数).注册提供程序时,可以像服务或工厂一样使用它的标准版本,但可以在之前使用提供程序版本.所以grumpy注册为的提供商

angular.module('...', [])
    .provider('grumpy', GrumpyProviderObject)
Run Code Online (Sandbox Code Playgroud)

然后在配置函数中可用

    .config(['grumpyProvider', ..., function (grumpyProvider, ...) { ... }])
Run Code Online (Sandbox Code Playgroud)

并且可以简单地注入控制器中

    .controller('myController', ['grumpy', ..., function (grumpy, ...) { ... }])
Run Code Online (Sandbox Code Playgroud)

grumpy注入的对象myController只是在$get方法上运行方法的结果GrumpyProviderObject.请注意,您注册的提供程序也可以是常规JavaScript构造函数.

注意:根据@Problematic的注释,提供者初始化(angular.module().provider(…)必须在config函数可用之前调用.

  • 谢谢你.值得注意的是,配置功能必须在提供者注入之后.可能很明显,但它绊倒了我! (4认同)
  • 这也适用于`constant`s,因为常量也是提供者. (2认同)

Lyu*_*man 10

你可以这样做:

(function() {
    'use strict';

    angular.module('name', name).config(config);
    // You can do this:
    config.$inject = ['$routeProvider', 'myService'];

    function config($routeProvider, myService) {
        // Or better to use this, but you need to use ng-annotate:
        /* ngInject */

    }
});
Run Code Online (Sandbox Code Playgroud)

这是描述最佳实践这里

  • 这应该不行,我很好奇为什么这么多的赞成?请参阅此处`配置块:在提供程序注册和配置阶段执行.只有提供程序和常量才能注入配置块.这是为了防止服务在完全配置之前意外实例化 (3认同)

Ale*_*oss 5

您可以手动调用angular.injector以访问在应用程序块期间没有依赖项的服务.config()。如果您创建的服务没有任何需要遍历的依赖项,那么您可能可以使用:

angular.module('myApp').config(function () {
    var myService = angular.injector(['ng']).get('myService');
});
Run Code Online (Sandbox Code Playgroud)

这也适用于其他简单服务,例如$http

angular.module('myApp').config(function () {
    var http = angular.injector(['ng']).get('$http');
});
Run Code Online (Sandbox Code Playgroud)

注意:通常您不需要在配置阶段注入服务,最好的设计是创建一个允许配置的提供程序。文档说这个功能是在 3rd 方库需要访问已经运行的 Angular 应用程序的注入器的情况下公开的。

  • 当您对尚未实例化的服务调用 [`$injector.get('serviceName')`](https://docs.angularjs.org/api/auto/service/$injector#get) 时(例如在 `.config()` 块中),注入器尝试在现场实例化该服务。如果该服务有任何依赖项,它将抛出错误,因为缺少这些依赖项。不幸的是,当您调用 `.get()` 时,您无法提供依赖项。`$location` [有一个依赖项](https://github.com/angular/angular.js/blob/master/src/ng/location.js#L671) 在 `$rootElement` 上,所以它不能以这种方式加载。 (2认同)