我一直在关注this https://angular-2-training-book.rangle.io/handout/modules/feature-modules.html#services-and-lazy-loaded-modules教程,了解延迟加载,下面是我的推论。
场景一:服务是通过将它们放入providers
子模块的数组
场景2:服务在子模块中提供,使用forRoot
方法
在场景 1 的上下文中,
- 如果急切地加载子模块,则服务的实例将添加到根注入器。
- 如果延迟加载子模块,则服务的实例将添加到根注入器,并将服务的新实例添加到子注入器,这不是通常的用例。
在场景 2 的上下文中,
他们提到了以下内容。
一开始,
因此,即使使用模块,也无法拥有“私有”
服务除非...模块正在延迟加载。
Finally,
虽然这个语法比原来的稍微复杂一些,但它
将向我们保证只有一个 CreditCardService 实例是
添加到根模块。当 CreditCardModule 加载时(甚至
延迟加载),不会添加该服务的新实例
儿童注射器。
如果该实例也将在根注入器中可用,那么他们如何说该服务已“私有化”?
我很困惑。有人请澄清一下。
providedIn: 'root'
是自 Angular 6 以来提供服务最简单、最高效的方式:
- 该服务将作为单例在应用程序范围内可用,无需将其添加到模块的提供者数组中(例如 Angular
- 如果服务仅在延迟加载模块中使用,它将随该模块一起延迟加载
- 如果从未使用过它,则不会包含在构建中(tree shake)。
有关更多信息,请考虑阅读文档 https://angular.io/guide/providers#providing-a-service and NgModule 常见问题解答 https://angular.io/guide/ngmodule-faq
Btw:
- 如果您不需要应用程序范围的单例,请改用提供者的组件数组。
- 如果您想限制范围,以便其他开发人员不会在特定模块之外使用您的服务,请改用提供程序的 NgModule 数组。*
*UPDATE
“使用 NgModule 的提供者数组”表示使用延迟加载模块的提供者数组,例如:
import { NgModule } from '@angular/core';
import { UserService } from './user.service';
@NgModule({
providers: [UserService],
})
export class UserModule {
}
或者在可注入装饰器中实际命名模块:
import { Injectable } from '@angular/core';
import { UserModule } from './user.module';
@Injectable({
providedIn: UserModule,
})
export class UserService {
}
引用文档:
当路由器在延迟加载上下文中创建组件时,
Angular 更喜欢从这些提供者创建的服务实例
应用程序根注入器的服务实例。
文档参考:https://angular.io/guide/providers#providedin-and-ngmodules https://angular.io/guide/providers#providedin-and-ngmodules
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)