gpt4 book ai didi

angular - 延迟加载是否会在 Angular 中创建新的注入(inject)器?

转载 作者:行者123 更新时间:2023-12-02 16:16:32 26 4
gpt4 key购买 nike

阅读Angular官方文档

When the Angular router lazy-loads a module, it creates a new injector. This injector is a child of the root application injector. The router adds all of the providers from the root injector to the child injector. When the router creates a component within the lazy-loaded context, Angular prefers service instances created from these providers to the service instances of the application root injector.

基于此,我创建了一个小型应用程序,它具有在应用程序的根组件中提供的一项服务。该服务有一个属性,它绑定(bind)到延迟加载的组件和急切加载的组件。我期望的是,急切加载的组件应该使用旧注入(inject)器中的服务实例。因此,急切加载的组件对服务属性的任何更改都不应该反射(reflect)在延迟加载的组件中。延迟加载的组件应该使用子注入(inject)器中的新服务实例。但这并没有发生。有人可以解释一下吗?

Here is the link to stackblitz.

最佳答案

  • 延迟加载是否在 Angular 中创建新的注入(inject)器?

对。

对于每个延迟加载的模块,Angular 都会创建从父注入(inject)器继承的注入(inject)器。

但这并不意味着这个继承的注入(inject)器将为父注入(inject)中提供的每个服务创建新实例除非您在延迟加载模块中提供此服务。否则,Angular 将遍历树来查找提供的服务,并在父注入(inject)器上找到它。

因此,只需将您的服务添加到 LazyModule providers 数组中,它将在 LazyModule 注入(inject)器中注册,这样 LazyComponent 将从延迟加载注入(inject)器获取实例。

@NgModule({
imports: [
CommonModule,
LazyRoutingModule
],
providers: [AppService], <=================
declarations: [LazyComponent]
})
export class LazyModule { }

我还建议您阅读这篇文章

更新

来自评论:

So shouldn't we have similar behaviour in case of lazy loading, as from doc. The router adds all of the providers from the root injector to the child injector.

我只相信代码。

当 Angular 创建延迟加载注入(inject)器(NgModuleRef)时,它仅传递对父注入(inject)器(NgModuleRef)的引用。

enter image description here

当它解析AppService依赖性时,它首先查看子注入(inject)器,然后查看父注入(inject)器,因为子注入(inject)器中没有注册的AppService

enter image description here

关于angular - 延迟加载是否会在 Angular 中创建新的注入(inject)器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52638901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com