底线是:
- 您不能将服务注入提供程序配置部分。
- 您可以将服务注入到初始化提供者服务的部分。
细节:
Angular 框架有两个阶段的初始化过程:
阶段 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
服务初始化函数将起作用:
//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
阶段执行,因此该代码将起作用。