首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$provide外部配置块

$provide外部配置块
EN

Stack Overflow用户
提问于 2015-04-24 18:22:39
回答 2查看 1.7K关注 0票数 3

我确实遗漏了一些关于注射器的基本点,但是我不明白为什么这个

代码语言:javascript
复制
angular.module('app').config(function ($provide) {
    ...
});

还有这个

代码语言:javascript
复制
angular.module('app').config(function ($injector) {
    $injector.invoke(function ($provide) { ... });
});

按预期工作,而这

代码语言:javascript
复制
app.run(function($provide) {
    ...
});

会扔

错误:$injector:unpr未知提供程序:$provideProvider <- $provide

如下所示,config与提供程序有一些特殊的关系,而run处理实例,但我不确定使config块如此特殊的原因。

因此,没有办法在$provide块之外访问config块,例如使用angular.injector() (虽然它似乎也获得了提供程序实例)?

这个问题,除了好奇之外,也有一些实际的考虑。在1.4中,所有的$provide函数都暴露在模块中,但对于1.3则不是这样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-14 02:31:29

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

本质上,$injector 构造函数$injector 其他任何地方是两个名称相同的不同服务,它们与$provide一起显式地定义在内部提供者/实例缓存上(这个服务是在提供者缓存中定义的,因此只能在config中注入)。

虽然由于可能的竞争条件,通常不建议使用,但是在配置阶段结束后,可以将内部服务公开到实例缓存中,并使特定于配置的$provide$injector可用于注入:

代码语言:javascript
复制
app.config(function ($provide, $injector) {
  $provide.value('$providerInjector', $injector);
  $provide.value('$provide', $provide);
});

可能的应用程序正在随时配置服务提供者(如果可能的话)

代码语言:javascript
复制
app.run(function ($providerInjector) {
  var $compileProvider = $providerInjector.get('$compileProvider');
  ...
});

并在运行时定义新组件。

代码语言:javascript
复制
app.run(function ($provide) {
  $provide.controller(...);
  ...
});
票数 3
EN

Stack Overflow用户

发布于 2015-04-24 20:43:05

config()函数的目的是允许您执行一些将影响整个应用程序的全局配置--包括服务、指令、控制器等。正因为如此,config()块必须在任何其他应用程序之前运行。但是,您仍然需要一种方法来执行上述配置,并将其提供给应用程序的其余部分。实现这一目标的方法是使用提供者。

提供者之所以“特别”,是因为它们有两个初始化部分,其中一个与config()块直接相关。看看下面的代码:

代码语言:javascript
复制
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,所以我不知道为什么这种行为明显改变了。如果有人知道原因,请告诉我,我会更新我的答案。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29854811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档