Angular:延迟加载带有服务的模块

2023-12-19

我一直在关注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 以来提供服务最简单、最高效的方式:

  1. 该服务将作为单例在应用程序范围内可用,无需将其添加到模块的提供者数组中(例如 Angular
  2. 如果服务仅在延迟加载模块中使用,它将随该模块一起延迟加载
  3. 如果从未使用过它,则不会包含在构建中(tree shake)。

有关更多信息,请考虑阅读文档 https://angular.io/guide/providers#providing-a-service and NgModule 常见问题解答 https://angular.io/guide/ngmodule-faq

Btw:

  1. 如果您不需要应用程序范围的单例,请改用提供者的组件数组。
  2. 如果您想限制范围,以便其他开发人员不会在特定模块之外使用您的服务,请改用提供程序的 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(使用前将#替换为@)

Angular:延迟加载带有服务的模块 的相关文章

随机推荐