в angular, круговая зависимость при использовании обеспечитьIn и forRoot - PullRequest
1 голос
/ 08 апреля 2020

Я занимаюсь разработкой библиотеки angular. у него есть внутренний сервис. который определен как ниже. Используется 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

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Ранее я отвечал на (не дублирующий) вопрос, который предоставляет вам альтернативы этому подходу.

{ ссылка }

Выполните эту настройку:

my-module.ts

declarations: [
  MyComponent
]

my-service.ts

@Injectable({ providedIn: MyModule })

my-component .ts

constructor(private myService: MyService) {}
  • my-service import my-module
  • my-module импортирует my-component
  • my-component импортирует my-service

Существует круговая зависимость.

Обходной путь

Обходной путь для этого - создать служебный модуль и импортировать его в ваш модуль.

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 {}
0 голосов
/ 08 апреля 2020

Я думаю, что произойдет следующее:

  1. У вас есть line-chart.component. js, который, вероятно, вызывает LineChartLibService.
  2. В пределах службы LineChartLibService, которую вы говорите что этот Injectable предоставляется в MyChartModule.
  3. Внутри MyChartModule вы, вероятно, объявляете line-chart.component. js частью этого модуля.

Это означает, что модуль запрашивает компонент, который запрашивает службу, которая запрашивает модуль, который затем запрашивает компонент снова: циклическая зависимость.

Если вы добавите больше кода и контекста в свой вопрос, мы могли бы сделать лучшее предложение; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...