底线是:
- 您不能将服务注入提供者配置部分。
- 您 CAN注入服务成初始化提供者的服务的部分。
细节:
Angular框架有两个阶段的初始化过程:
阶段1:配置
在此config
阶段,将初始化所有提供程序,并config
执行所有部分。这些config
部分可能包含配置提供程序对象的代码,因此可以将它们与提供程序对象一起注入。但是,由于提供者是服务对象的工厂,并且在此阶段,提供者尚未完全初始化/配置->您不能在此阶段要求提供者为您创建服务->在配置阶段您不能使用/注入服务。此阶段完成后,所有提供程序都准备就绪(配置阶段完成后,无法再进行任何提供程序配置)。
第二阶段:跑步
在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
服务注入服务初始化功能将起作用:
//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
阶段中执行,因此该代码将起作用。