how to inject dependency into module.config(configFn) in angular

后端 未结 8 1160
轮回少年
轮回少年 2020-11-27 14:40

In Angular, we can inject $routeProvider to the config function

module.config(function ($routeProvider) {


});

I

8条回答
  •  臣服心动
    2020-11-27 14:58

    If you want to inject dependency (let's say from a Service) to call a function form in routes (.config) as shown below templateProvider.getTemplate('about')

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

    You must create a Provider. Not Service nor Factory.

    Here’s a real example of a Provider that generates the template path from the name:

    (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';  
            }  
    
        };  
    })();  
    

    The usage of such Provider in the routes (.config) will be as follow:

    (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');  
        };  
    })();  
    

    VIP Note:

    to inject the provider you must postfix it with xxxProvider (that name of the provider should not be postfixed, only on injection in the .config).

提交回复
热议问题