自定义对话框循环依赖

时间:2018-09-05 22:28:09

标签: angular

我遇到了由自定义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();
  }

}

2 个答案:

答案 0 :(得分:0)

有时使用服务的@Injectable中的providerIn参数会发生这种情况。尝试将其从该位置删除,然后将其添加到app.module的提供者部分。

@Injectable()
export class ConfirmDialogService

app.module:

providers: [ConfirmDialogService]

答案 1 :(得分:0)

循环依赖的问题是由服务中的CustomOverlayRef类的声明引起的。

这还会导致程序全部崩溃。

我在单独的文件夹中声明了它,现在一切正常。