Iniezione di dipendenze nei moduli config () – AngularJS

Attualmente in app.js ho i seguenti percorsi:

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

Sto cercando di inserire la dipendenza Path come puoi vedere. Anche se ottengo un errore dicendo che non posso trovare questo fornitore. Penso che questo sia dovuto al fatto che i moduli di configurazione dei moduli di configurazione vengono eseguiti prima di ogni altra cosa. di seguito è la mia definizione del provider Path in 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; } } }); 

come posso iniettare questo fornitore in un modulo di configurazione?

In .config è ansible utilizzare solo i provider (ad esempio $routeProvider ). in .run è ansible utilizzare solo istanze di servizi (ad esempio $route ). Hai una fabbrica, non un fornitore. Vedi questo frammento con i tre modi di creare questo: Service, Factory e Provider. Lo menzionano anche nei documenti angolari https://docs.angularjs.org/guide/services

  1. angular.config accetta solo provider
  2. ogni servizio, fabbrica ecc sono istanze di Provider

Quindi, per iniettare un servizio in configurazione, è sufficiente chiamare il fornitore del servizio aggiungendo “Provider” al suo nome.

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

Secondo la documentazione del provider angularjs

… se si definisce una ricetta di fabbrica, viene automaticamente creato sotto il cofano un tipo di Provider vuoto con il metodo $ get impostato sulla funzione di fabbrica.

Quindi se hai una fabbrica (o un servizio) come:

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

Prima di accedere all’object restituito, devi prima richiamare la tua factory usando il metodo $ get:

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

Si dovrebbe usare costante per questo, perché è l’unica cosa che si può iniettare nella fase di configurazione diversa dai provider.

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

Questa discussione mi ha aiutato quando stavo cercando di capire la stessa cosa, in pratica

 $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; }] } })