Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 8-在延迟加载的模块中使用服务_Angular_Lazy Loading_Angular Services - Fatal编程技术网

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

Angular 8-在延迟加载的模块中使用服务,angular,lazy-loading,angular-services,Angular,Lazy Loading,Angular Services,我已经在Angular 8中实现了一个新的应用程序,它使用延迟加载。然而,我遇到了一个直到现在才意识到存在的问题。也就是说,在延迟加载模块中加载的服务将创建该服务的自身实例。如果我有两个使用相同服务的延迟加载模块,那么该服务将加载两次。我已经阅读了有关堆栈溢出的许多问题,包括以下问题: 我希望有人能在我的特定需求/实现方面帮助我 我有一个分屏的应用程序 屏幕一=组件A和组件B 屏幕2=部件B和部件C 屏幕三=组件C和许多其他组件 在我的应用程序路由.module.ts中,我惰性地加载了屏幕一

我已经在Angular 8中实现了一个新的应用程序,它使用延迟加载。然而,我遇到了一个直到现在才意识到存在的问题。也就是说,在延迟加载模块中加载的服务将创建该服务的自身实例。如果我有两个使用相同服务的延迟加载模块,那么该服务将加载两次。我已经阅读了有关堆栈溢出的许多问题,包括以下问题:

我希望有人能在我的特定需求/实现方面帮助我

我有一个分屏的应用程序

  • 屏幕一=组件A和组件B
  • 屏幕2=部件B和部件C
  • 屏幕三=组件C和许多其他组件
在我的应用程序路由.module.ts中,我惰性地加载了
屏幕一.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
      ],
    })