Цель функции config()
, чтобы позволить вам выполнить некоторые глобальную конфигурацию, которая будет влиять на все приложения - которая включает в себя услуги, директивы, контроллеры и т.д. Из-за того, config()
блок должен работать, прежде чем что-либо еще , Но вам все еще нужен способ выполнить вышеупомянутую конфигурацию и сделать ее доступной для остальной части приложения. И способ сделать это, используя провайдеров.
Что делает поставщиков «особенными» в том, что у них есть две части инициализации, и одна из них напрямую связана с блоком config()
. Взгляните на следующий код:
app.provider('myService', function() {
var self = {};
this.setSomeGlobalProperty = function(value) {
self.someGlobalProperty = value;
};
this.$get = function(someDependency) {
this.doSomething = function() {
console.log(self.someGlobalProperty);
};
};
});
app.config(function(myServiceProvider) {
myServiceProvider.setSomeGlobalProperty('foobar');
});
app.controller('MyCtrl', function(myService) {
myService.doSomething();
});
Когда Вы вводите поставщика в функцию config()
, вы можете получить доступ что-нибудь но$get
функцию (технически вы можете получить доступ к функции $get
, но называть его не будет Работа). Таким образом, вы можете выполнить любую конфигурацию, которая вам может понадобиться. Это первая часть инициализации. Стоит отметить, что хотя наш сервис называется myService
, здесь вы должны использовать суффикс Provider
.
Но когда вы вводите одного и того же провайдера в любое другое место, Angular вызывает функцию $get()
и вводит все, что возвращается. Это вторая часть инициализации. В этом случае провайдер ведет себя как обычный сервис.
Теперь про $provide
и $injector
. Поскольку они являются «службами конфигурации», для меня имеет смысл, что вы не можете получить к ним доступ за пределами блока config()
. Если бы вы могли, то вы могли бы, например, создать завод после, он был использован другой службой.
Наконец, я еще не играл с v1.4, поэтому я понятия не имею, почему это поведение, по-видимому, изменилось. Если кто-нибудь знает, почему, пожалуйста, дайте мне знать, и я уточню свой ответ.
Спасибо, Майкл, это качественный ответ, который хорошо послужит сообществу. В настоящее время я немного продвинулся дальше и не могу узнать ничего нового из ответа. Я надеялся, что кто-то поделится своими знаниями с внутренними силами. Думаю, мне нужно пройти «бутстрап» и «инжектор» и изучить их еще раз. – estus
В 1.4 'module', наконец, предоставляет весь API, который предоставляет' $ provision'. Это было не так в предыдущих версиях («декоратор» отсутствовал, по крайней мере). – estus