【问题标题】:in angular, Circular dependency when using providedIn and forRoot使用providedIn和forRoot时的角度,循环依赖
【发布时间】:2020-07-20 11:23:51
【问题描述】:

我正在开发一个角度库。它有一个内部服务。定义如下。 使用providedIn 可摇树。并且没有使用providedIn:'root',因为它是内部的,只是在模块范围内使用。

@Injectable({
  providedIn: MyChartModule,
})
export class LineChartLibService {

当我想在模块定义中添加forRoot 以在延迟加载中只有一个实例时,它会遇到循环依赖。

export class MyChartModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: MyChartModule,
      providers: [LineChartLibService],
    };
  }
}

在这种情况下我们应该怎么做? 是否可以在库中提供延迟加载的可摇树服务?

WARNING: Circular dependency: dist\my-chart\esm2015\lib\my-chart.module.js -> dist\my-chart\esm2015\lib\line-chart\line-chart.component.js 
-> dist\my-chart\esm2015\lib\line-chart-lib.service.js -> dist\my-chart\esm2015\lib\my-chart.module.js

【问题讨论】:

  • 可以在这里粘贴圆形路径吗?
  • @GouravGarg。编辑问题并添加警告。
  • 请添加整个模块代码,因为似乎还应该有一个 line-chart.component.js 在这里我们看不到。
  • 当您将其添加到提供者时:[] 那么为什么要分配 providedIn 呢?
  • @GouravGarg,因为它是可摇树的,也适用于那些没有调用 forRoot 的人。(它是一个库,你不知道它会在哪里使用)

标签: javascript angular typescript lazy-loading tree-shaking


【解决方案1】:

我之前回答了一个(非重复的)问题,该问题为您提供了这种方法的替代方案。

https://stackoverflow.com/a/60377431/5367916

进行此设置:

my-module.ts

declarations: [
  MyComponent
]

my-service.ts

@Injectable({ providedIn: MyModule })

my-component.ts

constructor(private myService: MyService) {}
  • 我的服务导入我的模块
  • 我的模块导入我的组件
  • 我的组件导入我的服务

存在循环依赖。

解决方法

解决方法是创建一个服务模块并将其导入您的模块。

my-module.ts

imports: [
  MyModuleServices
],
declarations: [
  MyComponent
]

my-module-services.ts

// no imports or declarations

my-service.ts

@Injectable({ providedIn: MyModuleServices })

my-component.ts

constructor(private myService: MyService) {}

另类

更直接的方法是将服务添加到模块的提供程序中。

@NgModule({
  providers: [ MyService ]
})
export class MyModule {}

【讨论】:

    【解决方案2】:

    我认为会发生以下情况:

    1. 您拥有可能需要 LineChartLibService 的 line-chart.component.js。
    2. 在 LineChartLibService 中,您说此 Injectable 在 MyChartModule 中提供。
    3. 在 MyChartModule 中,您可能将 line-chart.component.js 声明为该模块的一部分。

    这意味着模块请求组件,请求服务,请求模块,然后再次请求组件:循环依赖。

    如果您在问题中添加更多代码和上下文,我们可能会提出更好的建议;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2020-03-04
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      相关资源
      最近更新 更多