2016-10-03 44 views
2

这在文档中非常混乱,因为一部分建议在模块提供程序数组中加载服务将使其可用于整个应用程序,并且如果我们需要隔离此服务唯一的方法是将其包含在顶级父组件的提供者中,而不是功能模块提供者。Angular 2如何在功能模块中隔离服务提供者

当模块在应用程序启动加载,其@ NgModule.providers 有应用范围广。在整个申请中它们可用于注射 。

如果可以,请加载模块。 Angular 为它自己的子注入器提供了一个延迟加载的模块。模块的 供应商仅在使用此注入器创建的组件树内可见。

如果您必须加载模块,应用程序启动时, 代替提供组件中的服务。

https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-component-scoped-providers

在另一方面存在这样说,否则的文档另一部分以及用于隔离的服务,我们可以直接将其添加到模块的供应商阵列,并且将它隔离到这个特定的功能模块。

危机服务既不需要也不想在危机 中心域以外通缉。我们在CrisisCenterModule提供程序数组中注册了CrisisService,而不是将其注册到AppModule的提供商 - 这使得它在任何地方都可见。

这将CrisisService的范围限制为危机中心 路线。危机中心之外没有其他模块可以访问它。

https://angular.io/docs/ts/latest/guide/router.html#!#child-routing-component

这概念是正确的?

+1

我碰到了第二次报价几次,并想知道同样的事情。就我个人而言,笔者认为它可能是一个错字,部分作者的脑部放屁,或者是从未更新的早期草稿。更清楚的是,我认为第二个是错误的。如果'CrisisCenterModule'被延迟加载,那么它就是正确的,但是1)它不是,2)它们没有提到它被延迟加载。它的整个措辞使得它看起来像所有的模块得到自己的范围,这是不正确的 –

+1

我没有看到它提到,但是当模块被延迟加载,提供者不会成为全球可用,只在范围内懒加载模块。 –

+0

peeskillet我认为你是正确的路由器文档之前有NgModule和NgModule FAQ部分,所以我认为这是一个错误,只是想确保我没有失去我的大脑。 –

回答

1

这两个概念都是对的。在NgModule中定义一项服务会导致您可以使用该服务作为单例。

但是,如果将服务定义为独立组件,则angular将创建该服务的新实例。

相关问题