我遇到了由自定义Injector
创建的循环依赖关系
代码运行良好,直到到达以下行:
const componentPortal = new ComponentPortal(ConfirmDialogComponent, null, customInjector);
这会在终端和浏览器的控制台中产生以下错误:
警告:在循环依赖项中检测到: src \ app \ confirm-dialog.service.ts-> src \ app \ confirm-dialog \ confirm-dialog.component.ts-> src \ app \ confirm-dialog.service.ts
警告:在循环依赖项中检测到: src \ app \ confirm-dialog \ confirm-dialog.component.ts-> src \ app \ confirm-dialog.service.ts-> src \ app \ confirm-dialog \ confirm-dialog.component.ts
并在浏览器的控制台中产生此错误:
未捕获的错误:无法解析ConfirmDialogComponent的所有参数:(?)。
@Injectable({
providedIn: 'root'
})
export class ConfirmDialogService {
constructor(
private overlay: Overlay,
private injector: Injector,
) { }
public open() {
const overlayRef = this.overlay.create();
const dialogRef = new CustomOverlayRef(overlayRef);
const customInjector = this.createInjector(dialogRef);
const componentPortal = new ComponentPortal(ConfirmDialogComponent, null, customInjector);
const componentRef = overlayRef.attach(componentPortal);
}
private createInjector(customOverlayRef: CustomOverlayRef) {
const injectionTokens = new WeakMap();
injectionTokens.set(CustomOverlayRef, customOverlayRef);
return new PortalInjector(this.injector, injectionTokens);
}
}
export class CustomOverlayRef {
constructor(
private overlayRef: OverlayRef,
) { }
public close() {
this.overlayRef.dispose();
}
@Component({
selector: 'app-confirm-dialog',
templateUrl: './confirm-dialog.component.html',
styleUrls: ['./confirm-dialog.component.scss']
})
export class ConfirmDialogComponent implements OnInit {
constructor(
private customDialogRef: CustomOverlayRef,
) { }
ngOnInit() {
}
public close() {
this.customDialogRef.close();
}
}
答案 0 :(得分:0)
有时使用服务的@Injectable中的providerIn参数会发生这种情况。尝试将其从该位置删除,然后将其添加到app.module的提供者部分。
@Injectable()
export class ConfirmDialogService
app.module:
providers: [ConfirmDialogService]
答案 1 :(得分:0)
循环依赖的问题是由服务中的CustomOverlayRef
类的声明引起的。
这还会导致程序全部崩溃。
我在单独的文件夹中声明了它,现在一切正常。