Angular 8-在延迟加载的模块中使用服务
我已经在Angular 8中实现了一个新的应用程序,它使用延迟加载。然而,我遇到了一个直到现在才意识到存在的问题。也就是说,在延迟加载模块中加载的服务将创建该服务的自身实例。如果我有两个使用相同服务的延迟加载模块,那么该服务将加载两次。我已经阅读了有关堆栈溢出的许多问题,包括以下问题: 我希望有人能在我的特定需求/实现方面帮助我 我有一个分屏的应用程序Angular 8-在延迟加载的模块中使用服务,angular,lazy-loading,angular-services,Angular,Lazy Loading,Angular Services,我已经在Angular 8中实现了一个新的应用程序,它使用延迟加载。然而,我遇到了一个直到现在才意识到存在的问题。也就是说,在延迟加载模块中加载的服务将创建该服务的自身实例。如果我有两个使用相同服务的延迟加载模块,那么该服务将加载两次。我已经阅读了有关堆栈溢出的许多问题,包括以下问题: 我希望有人能在我的特定需求/实现方面帮助我 我有一个分屏的应用程序 屏幕一=组件A和组件B 屏幕2=部件B和部件C 屏幕三=组件C和许多其他组件 在我的应用程序路由.module.ts中,我惰性地加载了屏幕一
- 屏幕一=组件A和组件B
- 屏幕2=部件B和部件C
- 屏幕三=组件C和许多其他组件
屏幕一.module
和屏幕二.module
{ path: 'folders', loadChildren: '../app/screens/screen-one/screen-one.module#ScreenOneModule' },
{ path: 'folders/:folderID/projects/:projectID', loadChildren: '../app/screens/screen-two/screen-two.module#ScreenTwoModule' }
屏幕一.module.ts
在此模块中,我导入了另外两个模块(文件夹、项目列表),其中包含我需要在屏幕一.component.html中使用的组件,并显示为
&
我遇到的问题是,我在导入ProjectsListModule
和ProjectDetailModule
的屏幕2.module
上有类似的设置
我遇到的问题是,当使用FoldersService
和ProjectsListService
时,screen one.module
会加载它们,当导航到screen two.module
时,会再次注入另一个实例
在某些情况下,10个屏幕模块中总共有3个或4个需要访问这些服务
是否值得将所有服务置于app.module级别
或者,是否有一种方法可以在每个模块中包含服务,而不是在每次加载新的延迟加载模块时都注入服务
更新
我已经删除了与ProjectsListModule
和ProjectDetailModule
关联的所有提供程序,并且完全依赖于服务forRoot
功能。然而,这目前意味着,如果我在屏幕10上,那么在不需要数据库时,我将有服务查询数据库。当大约3个不同的模块需要一个查询数据库的服务时,我不知道如何解决这个问题。我希望它只被这3个模块使用,但不要有3个实例。使用providedIn:'root'
,正如文档中建议的那样,并在CLI默认生成它们时,提供您的服务,而不是将它们添加到ProjectsListModule:。另外,Angular 8改变了loadChildren的工作方式:。感谢您的回复。所有服务都在“根目录”中提供了。这是否意味着它们都将被全局加载而不是每个模块?有点困惑,是的。当然,除非您也在模块中显式地提供它们。发布一个完整的最小示例,再现问题。您的问题中缺少最重要的代码。另外,您所说的“分割屏幕”是什么意思?你是说同一个应用程序在两个不同的浏览器选项卡/框架中打开?如果是这样的话,你有两个应用实例,当然还有两个服务实例,这与延迟加载无关。否。一个屏幕。一个浏览器。一张账单。“分割屏幕”是一个术语,用于表达设计演示文稿。组件A位于左侧。组件B位于右侧。屏幕1将为组件A和组件B导入模块A和模块B。在html屏幕中,组件的添加方式如下:
&
按照文档中的建议以及CLI默认生成组件时,使用“根”中提供的来提供您的服务,而不是将它们添加到ProjectsModule:的提供程序中。另外,Angular 8改变了loadChildren的工作方式:。感谢您的回复。所有服务都在“根目录”中提供了。这是否意味着它们都将被全局加载而不是每个模块?有点困惑,是的。当然,除非您也在模块中显式地提供它们。发布一个完整的最小示例,再现问题。您的问题中缺少最重要的代码。另外,您所说的“分割屏幕”是什么意思?你是说同一个应用程序在两个不同的浏览器选项卡/框架中打开?如果是这样的话,你有两个应用实例,当然还有两个服务实例,这与延迟加载无关。否。一个屏幕。一个浏览器。一张账单。“分割屏幕”是一个术语,用于表达设计演示文稿。组件A位于左侧。组件B位于右侧。屏幕1将为组件A和组件B导入模块A和模块B。在屏幕html中,组件是这样添加的:
&
const routes: Routes = [
{
path: '',
component: ScreenOneComponent,
children: [
{
path: ':folderID/projects',
component: ScreenOneComponent,
}
]
},
]
@NgModule({
declarations: [
ScreenOneComponent
],
imports: [
CommonModule,
RouterModule.forChild(routes),
FoldersModule,
ProjectsListModule
],
})