使用provedIn和forRoot时的角度依赖性,圆弧依赖性

问题描述 投票:1回答:2

我正在开发一个角度库。它具有内部服务。定义如下。使用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
javascript angular typescript lazy-loading tree-shaking
2个回答
0
投票

我认为会发生以下情况:

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

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

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


0
投票

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

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-service导入my-module
  • 我的模块导入我的组件
  • 我的组件导入我的服务

存在循环依赖关系。

解决方法

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

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 {}
© www.soinside.com 2019 - 2024. All rights reserved.