Injetando Dependências nos Módulos config () – AngularJS

Atualmente em app.js eu tenho as seguintes rotas:

var gm = angular.module('gm', ['gm.services','gm.directives','gm.filters','gm.controllers','ngSanitize']); gm.config(['$routeProvider', 'Path', function($routeProvider, Path) { $routeProvider.when('/login', { templateUrl: Path.view('application/authentication/login.html'), controller: 'authController' }); $routeProvider.when('/dashboard', { templateUrl: Path.view('application/dashboard/index.html'), controller: 'dashboardController' }); $routeProvider.otherwise({ redirectTo: '/login' }); }]); 

Estou tentando influenciar a dependência Path como você pode ver. Embora eu receba um erro dizendo que não posso encontrar este provedor. Eu acho que isso é porque provistas de módulo de configuração são executados antes de qualquer outra coisa. abaixo está minha definição de provedor de caminho em services.js

 gm.factory("Path", function() { return { view: function(path) { return 'app/views/' + path; }, css: function(path) { return 'app/views/' + path; }, font: function(path) { return 'app/views/' + path; }, img: function(path) { return 'app/views/' + path; }, js: function(path) { return 'app/views/' + path; }, vendor: function(path) { return 'app/views/' + path; }, base: function(path) { return '/' + path; } } }); 

Como posso injetar esse provedor em um módulo de configuração?

No .config você só pode usar provedores (por exemplo, $routeProvider ). no .run você só pode usar instâncias de serviços (por exemplo, $route ). Você tem uma fábrica, não um provedor. Veja este trecho com as três formas de criar isso: Serviço, Fábrica e Provedor Eles também mencionam isso nos documentos angulares https://docs.angularjs.org/guide/services

  1. angular.config só aceita provedores
  2. cada serviço, fábrica, etc, são instâncias do Provedor

Então, para injetar um serviço na configuração, basta ligar para o Provedor do serviço, adicionando ‘Provedor’ ao nome dele.

 angular.module('myApp') .service('FooService', function(){ //...etc }) .config(function(FooServiceProvider){ //...etc }); 

De acordo com a documentação do provedor angularjs

… se você definir uma receita de fábrica, um tipo de provedor vazio com o método $ get definido para sua function de fábrica será criado automaticamente sob o capô.

Então, se você tem uma fábrica (ou serviço), como:

 .factory('myConfig', function(){ return { hello: function(msg){ console.log('hello ' + msg) } } }) 

Primeiro você precisa invocar sua fábrica usando o método $ get antes de acessar o object retornado:

  .config(function(myConfigProvider){ myConfigProvider .$get() .hello('world'); }); 

Você deve usar constante para isso, porque é a única coisa que você pode injetar na fase de configuração do que provedores.

 angular.module("yourModule").constant("paths", { base: function(){ ... } }); 

Esta discussão me ajudou quando eu estava tentando descobrir a mesma coisa, basicamente

 $routeProvider.when('/', { templateUrl:'views/main.html', controller:'MainController', resolve: { recentPosts: ['$q', 'backendService', function($q, backendService){ var deferred = $q.defer(); backendService.getRecentPosts().then( function(data) { var result = data.result; deferred.resolve(result); }, function(error) { deferred.reject(error); } ); return deferred.promise; }] } })