Подтвердить что ты не робот

Инъекционные зависимости в конфигурационных() модулях - AngularJS

В настоящее время в app.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'
    });

}]);

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

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

4b9b3361

Ответ 1

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

Ответ 2

  • angular.config принимает только поставщиков
  • каждая служба, factory и т.д. являются экземплярами поставщика

Чтобы внедрить сервис в конфигурацию, вам просто нужно позвонить поставщику услуги, добавив к нему имя "Provider".

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

В соответствии с angularjs Provider документация

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

Итак, если у вас есть factory (или услуга), например:

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

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

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

Ответ 3

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

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

Ответ 4

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

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