【问题标题】:Access root services in Angular lazy loaded module在 Angular 延迟加载模块中访问根服务
【发布时间】:2021-07-13 16:49:03
【问题描述】:

我正在使用 Angular 延迟加载模块,并希望在延迟加载模块中访问根服务,例如 AuthService。我想访问延迟加载模块中根注入器中存在的单例实例。

我正在关注https://angular.io/guide/providers,有两条语句导致了混淆:

当您将服务提供者添加到根应用程序注入器时,它在整个应用程序中都可用。

当 Angular 路由器延迟加载一个模块时,它会创建一个新的注入器。此注入器是根应用程序注入器的子代。想象一棵注射器树;每个延迟加载的模块都有一个根注入器,然后是一个子注入器。路由器将根注入器中的所有提供程序添加到子注入器。当路由器在延迟加载的上下文中创建组件时,Angular 更喜欢从这些提供程序创建的服务实例,而不是应用程序根注入器的服务实例。

第一条语句清楚地表明我可以在应用程序的任何位置访问根服务。而第二个是说延迟加载的模块将获得自己的注入器,并可能拥有自己的服务实例?

那么这有可能在延迟加载的模块中获取服务的单例实例吗?

【问题讨论】:

标签: angular dependency-injection


【解决方案1】:

如果您在整个应用中只寻找一个实例,您可以指定

@Injectable({
   providedIn: 'root',
})

此行为也可以通过在 app 模块中指定来覆盖 src/app/app.module.ts(提供者)

@Injectable() 装饰器标识一个服务类。 providedIn 属性配置了一个特定的ModuleInjector,这里是root,这使得服务在rootModuleInjector 中可用。

ModuleInjectors 是在延迟加载其他@NgModules 时创建的。

Reference Link

【讨论】:

  • 如果我们在根模块的提供者列表中声明服务,而不是使用这个 Injectable 注释,这个解决方案是否仍然有效。换句话说,只要我们不在惰性模块的提供者列表中声明服务,而是在根模块的提供者列表中声明服务或使用Injector({providedIn:'root'}),它应该实现什么海报想要。如果我的理解有误,请纠正我
猜你喜欢
  • 2018-06-19
  • 2018-04-10
  • 1970-01-01
  • 2017-02-22
  • 2017-06-21
  • 2019-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多