Ответ 1
В нижней строке:
- Вы не можете вводить услугу в раздел конфигурации поставщика.
- Вы можете ввести службу в раздел, который инициализирует службу поставщика.
Детали:
СтруктураAngular имеет 2-фазный процесс инициализации:
ФАЗА 1: Конфигурация
Во время фазы config
все провайдеры инициализируются, и все секции config
выполняются. Секции config
могут содержать код, который настраивает объекты-провайдеры, и поэтому им могут быть введены объекты-поставщики.
Однако, поскольку поставщики - это фабрики для объектов службы, и на этом этапе провайдеры не полностью инициализированы/настроены → , вы не можете попросить провайдера создать для вас сервис на этом этапе → на этапе конфигурации, который вы не могут использовать/внедрять службы.
Когда эта фаза завершена, все поставщики готовы (после завершения фазы конфигурации конфигурация конфигурации не может быть выполнена).
ФАЗА 2: Выполнить
В фазе run
выполняются все секции run
. На этом этапе провайдеры готовы и могут создавать сервисы → во время фазы run
вы можете использовать/внедрять службы.
Примеры:
1. Включение службы $http
в функцию инициализации провайдера НЕ РАБОТАЕТ
//ERRONEOUS angular.module('myModule').provider('myProvider', function($http) { // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase) ... this.$get = function() { // code to initialize/configure the SERVICE goes here (executed during `run` stage) return myService; }; });
Так как мы пытаемся внедрить службу $http
в функцию, которая выполняется во время фазы config
, мы получим ошибку:
Uncaught Error: Unknown provider: $http from services
Эта ошибка на самом деле говорит о том, что $httpProvider
, который используется для создания службы $http
еще не готов (поскольку мы все еще находимся в фазе config
).
2. Включение службы $http
в функцию инициализации службы WILL:
//OK
angular.module('myModule').provider('myProvider', function() {
// SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
...
this.$get = function($http) {
// code to initialize/configure the SERVICE goes here (executed during `run` stage)
return myService;
};
});
Поскольку мы теперь вводим службу в функцию инициализации службы, которая выполняется во время фазы run
, этот код будет работать.