一尘不染

$提供外部配置块

angularjs

我当然缺少有关喷油器的一些基本知识,但是我无法理解为什么

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块如此特别的东西。

结果,是否没有办法到达$provide外部config块,例如,使用angular.injector()(尽管似乎也获得了提供者实例)?

除了好奇心外,这个问题还有一些实际考虑。在1.4中,所有$provide功能都暴露给模块,但对于1.3而言并非如此。


阅读 151

收藏
2020-07-04

共1个答案

一尘不染

经过一些角度注射器的研究,我能够对自己的问题给出详尽的答案。

从本质上讲,$injector
config块和provider构造函数中以及$injector
其他各处,都有两个具有相同名称的不同服务,它们在内部提供程序/实例缓存中显式定义,并且在一起$provide(此代码在提供程序缓存中定义,因此只能注入config

虽然一般不建议,因为可能的竞争条件,有可能接触到实例缓存和配置特定的进行内部服务$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(...);
  ...
});
2020-07-04