AngularJS: инъекционные провайдеры в функции.config
Я не могу ввести поставщик AngularJS, называемый UserAgent
внутри .config
функция, но я получаю эту ошибку:
Uncaught Error: [$injector:modulerr] Failed to instantiate module app due to:
Error: [$injector:unpr] Unknown provider: UserAgent
Это мой конфиг:
angular
.module('app')
.config(Config);
Config.$inject = ['$routeProvider', 'UserAgent'];
function Config($routeProvider, UserAgent) {
/*** code here ***/
}
И это мой провайдер:
angular
.module('app')
.provider('UserAgent', UserAgent);
function UserAgent() {
return {
$get: function () {
return {
title: "Testing..."
};
}
};
}
3 ответа
Измените UserAgent в следующей строке на UserAgentProvider....
Config.$inject = ['$routeProvider', 'UserAgent'];
Config.$inject = ['$routeProvider', 'UserAgentProvider'];
вот как angular ожидает, что провайдеры, выставленные приложениями, будут ссылаться как на зависимые приложения: <ActualProviderName>Provider
, слово "Поставщик" добавляется к фактическому имени поставщика.
Извините за этот вопрос, но я боролся с этой же проблемой и, к счастью, нашел решение. Я не специалист по Angular, так что моё решение может быть сделано лучше, но надеюсь, что это поможет кому-то там.
Глядя на документацию AngularJS для провайдеров, их пример утверждает:
myApp.provider('unicornLauncher', function UnicornLauncherProvider() {});
И затем они показывают, как внедрить этого провайдера в функцию конфигурации:
myApp.config(["unicornLauncherProvider", function(unicornLauncherProvider) {});
Важно отметить соглашение о присвоении имен: в имени провайдера нет слова "Провайдер" в момент объявления, но внедрение конфигурации делает это.
Как и вы, я также использую именованную функцию для моей конфигурации. Таким образом, мое объявление о внедрении конфигурации было похоже на
angular.module('sample').config(['UserAgentProvider', config]);
Тем не менее, вы делаете это немного по-другому, используя .$inject
инжектор. Таким образом, ваше конечное решение будет выглядеть так:
angular.module('sample').config(config);
config.$inject = ['UserAgentProvider'];
Я тоже использовал инжектор.$ Inject, но переключился на синтаксис стиля документации AngularJS из-за этого:
Обратите внимание, что поставщик единорога вводится в функцию конфигурации. Эта инъекция выполняется инжектором поставщика, который отличается от инжектора обычного экземпляра тем, что он создает и подключает (внедряет) только все экземпляры поставщика.
Не уверен, что .config(['MyNamedProvider', NamedConfigFunction])
лучше против NamedConfigFunction.$inject = ['MyNamedProvider'];
Но важным моментом является исключение "провайдера" во время объявления провайдера, но добавление его обратно во время введения провайдера
Вы не можете пользоваться услугами на этапе настройки. Этап настройки используется для настройки поставщиков услуг. Как только это будет сделано, поставщики будут вызваны для создания услуг.