我确实遗漏了一些关于注射器的基本点,但是我不明白为什么这个
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则不是这样。
发布于 2015-11-14 02:31:29
经过一些角度喷射器的研究,我能够对我自己的问题给出一个详尽的答案。
本质上,$injector 构造函数和$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(...);
...
});发布于 2015-04-24 20:43:05
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后缀。
但是,当您将相同的提供程序注入到任何其他地方时,角调用$get()函数并注入它返回的任何内容。这是第二个初始化部分。在这种情况下,提供者的行为就像一个普通的服务。
现在是关于$provide和$injector。因为它们是“配置服务”,所以您不能在config()块之外访问它们对我来说是有意义的。如果可以的话,那么您就可以在工厂被其他服务使用之后创建一个工厂。
最后,我还没有使用v1.4,所以我不知道为什么这种行为明显改变了。如果有人知道原因,请告诉我,我会更新我的答案。
https://stackoverflow.com/questions/29854811
复制相似问题