Введение зависимостей в модули config () - AngularJS


в настоящее время в приложение.js у меня есть следующие маршруты:

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

}]);

Я пытаюсь в ject зависимости пути, как вы можете видеть. Хотя я получаю ошибку, говоря, что он не может найти этого поставщика. Я думаю, что это связано с тем, что провайзеры модуля конфигурации выполняются сначала, прежде чем что-либо еще. ниже приведено мое определение поставщика пути в службах.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; 
    }
  }
}); 

Как я могу ввести этот поставщик в модуль конфигурации?

4 54

4 ответа:

на .config вы можете использовать только поставщики (например,$routeProvider). в .run вы можете использовать только экземпляры служб (например,$route). У вас есть фабрика, а не поставщика. смотрите этот фрагмент с тремя способами создания этого: Service, Factory и Provider Они также упоминают об этом в угловых документах https://docs.angularjs.org/guide/services

  1. угловое.config принимает только поставщиков
  2. каждое обслуживание, фабрика etc экземпляры провайдера

таким образом, чтобы внедрить службу в config, вам просто нужно позвонить поставщику службы, добавив "поставщик" к его имени.

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

согласно поставщику angularjs документация

... если вы определяете заводской рецепт, пустой тип поставщика с помощью метода $get, установленного на вашем заводе функция автоматически создается под капотом.

так что если у вас есть завод (или услуги), например:

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

сначала вам нужно вызвать свою фабрику с помощью метода $get перед доступом к возвращаемому объекту:

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

вы должны использовать константу для этого, потому что это единственное, что вы можете ввести в фазе конфигурации, кроме поставщиков.

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

этой обсуждение помог мне, когда я пытался выяснить то же самое, в принципе

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