我当然缺少有关喷油器的一些基本知识,但是我无法理解为什么
angular.module('app').config(function ($provide) { ... });
还有这个
angular.module('app').config(function ($injector) { $injector.invoke(function ($provide) { ... }); });
按预期工作,而这
app.run(function($provide) { ... });
会抛出
错误:[$ injector:unpr]未知提供程序:$ provideProvider <-$ provide
如下所述,config与提供者有一些特殊的关系,而run与实例打交道时,我不确定使config块如此特别的东西。
config
run
结果,是否没有办法到达$provide外部config块,例如,使用angular.injector()(尽管似乎也获得了提供者实例)?
$provide
angular.injector()
除了好奇心外,这个问题还有一些实际考虑。在1.4中,所有$provide功能都暴露给模块,但对于1.3而言并非如此。
经过一些角度注射器的研究,我能够对自己的问题给出详尽的答案。
从本质上讲,$injector 在config块和provider构造函数中以及$injector 其他各处,都有两个具有相同名称的不同服务,它们在内部提供程序/实例缓存中显式定义,并且在一起$provide(此代码在提供程序缓存中定义,因此只能注入config) 。
$injector
provider
虽然一般不建议,因为可能的竞争条件,有可能接触到实例缓存和配置特定的进行内部服务$provide和$injector配置阶段结束后注射可供选择:
app.config(function ($provide, $injector) { $provide.value('$providerInjector', $injector); $provide.value('$provide', $provide); });
可能的应用程序随时在配置服务提供商(如果可能)
app.run(function ($providerInjector) { var $compileProvider = $providerInjector.get('$compileProvider'); ... });
在运行时定义新组件
app.run(function ($provide) { $provide.controller(...); ... });