问题描述
我一直在关注 本教程,了解延迟加载,以下是我的推论.
I've been following this tutorial, to understand lazy loading, and below is my inference.
场景 1:通过将服务放在子模块的 providers
数组中来提供服务
Scenario 1: Services are provided by putting them in the providers
array of a child module
场景 2: 使用 forRoot
方法在子模块中提供服务
Scenario 2: Services are provided in a child module using the forRoot
approach
在情景 1 中,
- 如果急切加载子模块,则会将服务实例添加到根注入器中.
- 如果延迟加载子模块,则会将服务的一个实例添加到根注入器中,并将该服务的新实例添加到子注入器中,这不是通常的用例.
结合情景 2,
如果一个子模块被急切加载,服务的一个实例是添加到根注入器.
If a child module is eagerly loaded, an instance of the service isadded to the root injector.
如果一个子模块被延迟加载,服务的同一个实例在根模块和子模块中都可用,这是通常的用例.
If a child module is lazily loaded, the same instance of the serviceis available in both the root and the child module, which is theusual use case.
他们提到了以下内容.
一开始,
因此,即使在使用模块时,也无法拥有私有"服务,除非...模块被延迟加载.
最后,
虽然这个语法比原来的更复杂一些,但它将向我们保证只有 CreditCardService 的一个实例是添加到根模块.当 CreditCardModule 加载时(即使延迟加载),不会将该服务的新实例添加到儿童注射器.
如果该实例也将在根注入器中可用,他们如何说该服务已私有化"?
If the instance is going to be available in the root injector as well, how do they say that the service is 'privitized'?
我很困惑.有人请澄清.
I'm confused. Someone please clarify.
推荐答案
providedIn: 'root'
是自 Angular 6 以来提供服务的最简单、最有效的方式:
providedIn: 'root'
is the easiest and most efficient way to provide services since Angular 6:
- 该服务将作为单例在整个应用程序中可用,无需将其添加到模块的 providers 数组(如 Angular
- 如果服务仅在延迟加载的模块中使用,它将与该模块一起延迟加载
- 如果它从未使用过,它将不会包含在构建中(摇树).
有关更多信息,请考虑阅读文档和NgModule 常见问题
For further informations consider reading the documentation and NgModule FAQs
顺便说一句:
- 如果您不想要应用程序范围的单例,请改用提供者的组件数组.
- 如果您想限制范围,以便其他开发人员永远不会在特定模块之外使用您的服务,请改用提供者的 NgModule 数组.*
*更新
'use the provider's array of NgModule instead'表示使用延迟加载模块的providers数组,例如:
'use the provider's array of NgModule instead' means to use the providers array of the lazy loaded module, eg:
import { NgModule } from '@angular/core';
import { UserService } from './user.service';
@NgModule({
providers: [UserService],
})
export class UserModule {
}
或在可注入装饰器中实际命名模块:
OR to actually name the module in the injectable decorator:
import { Injectable } from '@angular/core';
import { UserModule } from './user.module';
@Injectable({
providedIn: UserModule,
})
export class UserService {
}
引自文档:
当路由器在延迟加载的上下文中创建一个组件时,Angular 更喜欢从这些提供者创建的服务实例.应用程序根注入器的服务实例.
文档参考:https://angular.io/guide/providers#providin-and-ngmodules
这篇关于Angular:带有服务的延迟加载模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!