Ошибки круговой зависимости не имеют ничего общего с Angular.Это просто означает, что вы импортируете в бесконечном цикле, используя TypeScript.
Например;
a-service.ts
import {B} from "./b-service';
export class A { b: B; };
b-service.ts
import {A} from "./a-service';
export class B { a:A; };
Вы можете добиться того же объявления провайдера, просто добавив его в модуль.
my-service.ts
@Injectable()
export class MyService {}
lazy-module.ts
import {MyService} from './my-service';
@NgModule({
providers: [MyService]
})
export class LazyModule {}
Вышеописанное имеет тот же эффект, что и @Injectable({provideIn: LazyModule})
.Это должно разорвать цепочку, возвращающуюся к LazyModule
, но в некоторых случаях это не решает проблему.
Вместо этого используйте интерфейсы
Если вы застрялизатем вам нужно внедрить interface
для службы и использовать его в компоненте или других неработающих ссылках.
my-service-interface.ts
export const MY_SERVICE: InjectionToken<IMyService> = new InjectionToken<IMyService>('MY_SERVICE');
export interface IMyService {
// methods
}
my-service.ts
@Injectable()
export class MyService implements IMyService {
}
lazy-module.ts
@NgModule({
providers: [
{provide: MY_SERVICE, useClass: MyService}
]
})
export class LazyModule {}
my-component.ts
@Component({...})
export class MyComponent {
constructor(@Inject(MY_SERVICE) service: IMyService) {
// no circular references using just an interface
}
}