75

$routeProvider在 Angular 中,我们可以注入config函数

module.config(function ($routeProvider) {


});

我想将我的服务注入其中

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


});

我确信服务定义正确,但它会抛出一个异常unknown myService,当我注入时会抛出一个异常

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


});

它仍然说unknown $http

你知道为什么吗?

4

7 回答 7

94

模块页面,“模块加载和依赖项”部分:

配置块- 在提供者注册和配置阶段执行。只有提供者和常量可以注入到配置块中。这是为了防止在完全配置之前意外实例化服务。

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

所以你不能将你自己的服务,或者像 $http 这样的内置服务注入到 config() 中。使用run()代替。

于 2013-03-08T05:01:15.423 回答
58

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

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

angular.module('...', [])
    .provider('grumpy', GrumpyProviderObject)

然后在配置函数中可用

    .config(['grumpyProvider', ..., function (grumpyProvider, ...) { ... }])

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

    .controller('myController', ['grumpy', ..., function (grumpy, ...) { ... }])

grumpy注入的对象myController只是$getGrumpyProviderObject. 请注意,您注册的提供者也可以是常规的 JavaScript 构造函数。

注意:根据@Problematic 的评论,提供程序初始化(调用angular.module().provider(…)必须在配置函数可用之前进行。

于 2013-07-24T23:54:55.947 回答
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 */

    }
});

这是此处描述的最佳实践

于 2015-08-07T16:54:28.163 回答
5

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

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

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

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

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

于 2015-12-17T04:38:47.793 回答
4

如果您想注入依赖项(比如说来自服务)以在路由(.config)中调用函数表单,如下所示templateProvider.getTemplate('about')

.state('index.about', {  

    url: "/about",  
    templateUrl: templateProvider.getTemplate('about'),  
    controller: 'AboutCtrl',  
    controllerAs: 'about',  
    data: {pageTitle: 'About Us Page'}  

})  

您必须创建一个提供者。不是服务也不是工厂。

这是一个从名称生成模板路径的 Provider 的真实示例:

(function () {  

    'use strict';  
    angular  

        .module('mega-app')  

        .provider('template', provider);  

      function provider(CONSTANT) {  

        // The provider must include a $get() method This $get() method  
        // will be invoked using $injector.invoke() and can therefore use  
        // dependency-injection.  
       this.$get = function () {  

            return {}  

        };  
       /**  
         * generates template path from it's name  
         *  
         * @param name  
         * @returns {string}  
         */  
       this.getTemplate = function (name) {  

            return CONSTANT.TEMPLATES_URL + name + '/' + name + '.html';  
        }  


        /**  
         * generates component path from it's name  
         * @param name  
         * @returns {string}  
         */  
       this.getComponent = function (name) {  

            return CONSTANT.COMPONENTS_URL + name + '.html';  
        }  

    };  
})();  

此类 Provider 在路由 (.config) 中的用法如下:

(function () {  

    'use strict';  
    angular  

        .module('mega-app')  

        .config(routes);  
   function routes($stateProvider, $urlRouterProvider, templateProvider) {  



       $stateProvider  
            //----------------------------------------------------------------  
            // First State  
            //----------------------------------------------------------------  
            .state('index', {  

                abstract: true,  
                url: "/index",  
                templateUrl: templateProvider.getComponent('content'),  
                controller: 'IndexCtrl',  
                controllerAs: 'index',  
            })  

            //----------------------------------------------------------------  
            // State  
            //----------------------------------------------------------------  
            .state('index.home', {  

                url: "/home",  
                templateUrl: templateProvider.getTemplate('home'),  
                controller: 'HomeCtrl',  
                controllerAs: 'home',  
                data: {pageTitle: 'Home Page'}  

            })  

            //----------------------------------------------------------------  
            // State  
            //----------------------------------------------------------------  
            .state('index.about', {  

                url: "/about",  
                templateUrl: templateProvider.getTemplate('about'),  
                controller: 'AboutCtrl',  
                controllerAs: 'about',  
                data: {pageTitle: 'About Us Page'}  

            })  

        //----------------------------------------------------------------  
        // Default State  
        //----------------------------------------------------------------  
       $urlRouterProvider.otherwise('/index/home');  
    };  
})();  

贵宾注意事项:

要注入提供程序,您必须使用 xxxProvider 对其进行后缀(该提供程序的名称不应后缀,仅在 .config 中注入时)。

于 2015-12-04T09:36:41.343 回答
-2

如果它可以让你们中的一些人更容易。

根据这个答案中的解释,您可以附加Provider到您的自定义服务,然后使用$get().

它可能不是最干净的解决方案,但它可以完成工作。

module.config(function ($routeProvider, myServiceProvider) {
 // Call a function hello() on myService.
 myServiceProvider.$get().hello();
});
于 2016-07-27T13:00:37.340 回答
-15

你可以试试这个:

module.config(['$routeProvider', '$http', function ($routeProvider, $http) {}]);
于 2015-02-02T00:49:36.473 回答