Как вводить зависимости в провайдер, используя Angularjs?
Возможно ли выполнить DI в методе поставщика?
В этом примере
angular.module('greet',[])
.provider('greeter',function() {
this.$get=function() {
};
})
.service('greeterService',function($http){
console.log($http);
})
;
Инъекция $http
в службу представляется правильной реализацией, но она не работает в методе провайдера и вызывает ошибку:
Неизвестный поставщик: $http
Используется ли метод провайдера с DI для инъекций услуг?
Ответы
Ответ 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. Не совсем красиво...