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

Как вводить зависимости в провайдер, используя Angularjs?

Возможно ли выполнить DI в методе поставщика?

В этом примере

angular.module('greet',[])
.provider('greeter',function() {

  this.$get=function() {

  };
})
.service('greeterService',function($http){
  console.log($http);
})
;

Инъекция $http в службу представляется правильной реализацией, но она не работает в методе провайдера и вызывает ошибку:

Неизвестный поставщик: $http

Используется ли метод провайдера с DI для инъекций услуг?

4b9b3361

Ответ 1

Вы можете, конечно, ввести $http поставщику. Просто убедитесь, что он отображается в $get, а не в конструкторе функций. Как показано ниже:

angular.module('greet',[]).provider('greeter',function() {
  this.$get = function($http) {

  };
});

Ответ 2

Вы можете вводить константы и другие провайдеры в провайдер. Не услуги или заводы - за одним исключением. Кажется, что вы можете ввести услугу $injector в провайдер - по крайней мере, вы можете в AngularJS 1.3.16.

.provider('foo', ['$injector', function ($injector) {
  var messagePrefix = $injector.get('msgPrefix');
  this.message = '';

  this.$get = function() {
    var that = this;
    return function() {
      return messagePrefix + that.message;
    }
  };
}])

Вы можете использовать инжектор вне метода $get, но вы по-прежнему не можете получить от него службы во время настройки.

См. здесь демонстрацию.

Ответ 3

После ответа IgrCndd, вот шаблон, который может избежать потенциальной гадости:

angular.module('greet',[]).provider('greeter', function() {

    var $http;

    function logIt() {
        console.log($http);
    }

    this.$get = ['$http', function(_$http_) {
        $http = _$http_;

        return {
            logIt: logIt
        };
    }];
});

Обратите внимание, как это похоже на эквивалентную услугу, делая преобразование между двумя менее проблематичными:

angular.module('greet',[]).factory('greeter', ['$http', function($http) {

    function logIt() {
        console.log($http);
    }

    return {
        logIt: logIt
    };
});

Ответ 4

Нет, вы не можете вводить услугу самому провайдеру. Инъекция услуги в метод провайдера $get аналогична введению службы в factory, но вы не можете напрямую ее вводить в функцию поставщика.

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

Это означает, что вы не можете использовать какую-либо услугу вообще во время фазы загрузки/конфигурации модуля ваших модулей. Это все, что вы запускаете внутри своих конфигурационных блоков, например, при определении маршрутов или состояний приложений, не может использовать какую-либо службу.

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

Вы могли бы сделать что-то вроде IgrCndd. Но если вам нужно было потреблять провайдера в блоке конфигурации, который в конечном итоге является целью поставщика, вы не будете вводить свои значения до тех пор, пока это не произойдет. Так что это не сработает, если вы не сделаете неприятный взлом с помощью promises.

Дальнейшее чтение инъекций

Ответ 5

Фактически вам нужно ввести зависимость от $get и затем сохранить ее для использования на том, что вы получаете из $get. Не совсем красиво...