Angular 8-在延迟加载的模块中使用服务

时间:2019-07-12 07:41:48

标签: angular lazy-loading angular-services

我一直在Angular 8中实现一个使用延迟加载的新应用。但是,我遇到了一个直到现在才意识到的问题。也就是说,在延迟加载的模块中加载的服务将创建它自己的服务实例。如果我有两个使用相同服务的延迟加载模块,则该服务将加载两次。我已经阅读了许多有关堆栈溢出的问题,其中包括:How do I provide a service in a lazy-loaded module and have that service scoped to just the lazy-loaded module and its components?.

我希望有人可以帮助我解决我的特定要求/实施。

我有一个分屏的应用程序。

  • 第一个屏幕=组件A和组件B
  • 第二屏=组件B和组件C
  • 第三屏=组分C及其他

在我的 app-routing.module.ts 中,我懒加载了screen-one.modulescreen-two.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'  }

screen-one.module.ts

在此模块中,我将导入另外两个模块(文件夹,项目列表),其中包含我需要在screen-one.component.html中使用的组件,并显示为<app-folders></app-folders><app-projects></app-projects>

const routes: Routes = [
  {
    path: '',
    component: ScreenOneComponent,
    children: [
      {
        path: ':folderID/projects',
        component: ScreenOneComponent,
      }
    ]
  },
]    
@NgModule({
  declarations: [
    ScreenOneComponent
  ],
  imports: [
    CommonModule,
    RouterModule.forChild(routes),
    FoldersModule,
    ProjectsListModule
  ],
})

我遇到的问题是,我为导入screen-two.moduleProjectsListModule的{​​{1}}进行了类似的设置。

我遇到的问题是,在使用ProjectDetailModuleFoldersService时,ProjectsListService会加载它们,而导航到screen-one.module时,会再次注入另一个实例

在某些情况下,总共10个屏幕模块中的3个或4个将需要访问这些服务。

  1. 是否值得将所有服务置于app.module级别?
  2. 还是有一种方法可以在每个模块中包含服务,而不必在每次加载新的延迟加载模块时都注入服务?

更新 我已经删除了与screen-two.moduleProjectsListModule相关的所有提供程序,并完全依赖于服务ProjectDetailModule的功能。但是,当前的含义是,如果我在屏幕10上,那么我将在不需要数据库时让服务查询数据库。当大约3个不同的模块需要一种查询数据库的服务时,不确定如何解决此问题。我希望只有3个模块可以使用它,但不要有3个实例。

0 个答案:

没有答案