【问题标题】:What is the difference between providedIn any and rootprovidedIn any 和 root 有什么区别
【发布时间】:2020-05-10 12:58:10
【问题描述】:

在 Angular 9 中,可注入装饰器选项 providedIn 有一个名为 any 的新值。 rootany有什么区别?

在我使用 any 的情况下,服务是否被视为单例?

@Injectable({providedIn: 'any'})
class UsefulService {
}

【问题讨论】:

  • any 是一个超级令人困惑的名字(我敢肯定,这个名字已经讨论了大约一个月!)如果你把providedIn 读成provided by which ngModule 会更容易

标签: angular typescript angular-services angular-dependency-injection


【解决方案1】:

我认为提供的答案并不是很清楚。但是,@jkonst、@schrödingcöder 和 @Bruce 在评论中是正确的。

对于任何由 Google 发送到这里的人,

any 不会在每个模块中提供唯一的实例。 (应该只在每个共享模块中说)

这意味着每个注入范围

中都有一个实例

来自https://angular.io/guide/providers

使用providedIn: 'any',所有急切加载的模块共享一个单例实例;但是,每个延迟加载的模块都有自己唯一的实例,如下图所示。

【讨论】:

  • 这很有帮助,谢谢?
  • 感谢@malbarmavi,感谢所有为这个线程提供支持的人。我也有和你一样的问题。
【解决方案2】:

angular 9 除了之前的root 和模块选项外,还为可注入装饰器提供了新选项,现在我们有两个额外的选项 platform , any

? root——这告诉 Angular 在应用程序根级别提供服务,并且服务将创建一次 (singleton service ) 并在每个注入令牌的模块中提供相同的实例

? any——在每个模块(包括惰性 模块)注入令牌。

? platform——指定 providedIn: 'platform' 使服务 在一个特殊的单例平台注入器中可用,该注入器由 页面上的所有应用程序。

a detailed look at Angular's 'root' and 'any' provider scopes

【讨论】:

  • 根据 Angular 文档,“any”将仅在惰性模块中提供唯一实例,但所有急切加载的模块将共享一个单例实例。那么“any”怎么会在每个模块中都提供一个唯一的实例呢?
  • @Bruce,你是对的。它是每个模块注入器范围的一个实例。基本上每个运行时包一个实例。
【解决方案3】:

rootany 之间的区别 offical documentation

  • root:大多数应用程序中的应用程序级注入器。

  • platform : 一个特殊的单例平台注入器,由所有人共享 页面上的应用程序。

  • any : 接收解析的 NgModule 注入器。

更多详情请参考article

在我使用any 的情况下,服务是否被视为单例? -

【讨论】:

  • 在我使用具有any 选项的服务的每个模块中是否正确地说我将拥有该服务的新实例?
  • 是的,它是正确的。如果有帮助,请将其标记为答案。
  • 这篇文章有关于anyplatform新选项的完整信息,谢谢?
  • 似乎引用的文章为“任何”声明“所有急切加载的模块共享一个由根模块注入器提供的实例。”大概这意味着只有一个惰性模块才会有它的新实例。
  • 说在每个模块中都有该服务的新实例是不正确的。急切加载的模块共享一个实例。这也在角度文档中进行了解释:angular.io/guide/providers
猜你喜欢
  • 2017-10-19
  • 2019-06-07
  • 1970-01-01
  • 2015-07-12
  • 2019-11-19
  • 2022-12-03
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多