单击外部时如何关闭没有背景的垫子对话框?

dot*_*pro 4 angular-material angular material-dialog

如何通过单击外部来关闭此stackblitz 示例 (最小、可重现示例)中的对话框?

如果我删除属性hasBackdrop: false->工作 Stackblitz 示例,这可以正常工作

Chr*_*ert 7

创建在对话框外部单击时关闭的Angular Material 对话框(同时创建没有背景的外观)的标准方法是使用内置库 CSS 类cdk-overlay-transparent-backdrop并使用MatDialogConfig属性应用它backdropClass

openDialog方法是:

openDialog(): void {
  const dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
    backdropClass: 'cdk-overlay-transparent-backdrop',
    hasBackdrop: true,
    width: '250px'
  });
}
Run Code Online (Sandbox Code Playgroud)

参见Stackblitz 示例

  • 这与kevits的回答相同。如果我这样做,我必须单击按钮两次才能关闭背景一次才能单击按钮 (2认同)
  • 不,我的意思是,如果页面上有按钮,现在您必须单击该按钮两次才能关闭背景,然后才能实际单击该按钮。这是有缺陷的行为 (2认同)

G. *_*ter 7

简而言之,您需要执行自己的点击处理 - 监听点击并确定它们是否在对话框之外。这使您可以不像背景那样捕获点击事件。这是一个基于您的StackBlitz 示例:

@Component({
  selector: 'dialog-overview-example',
  templateUrl: 'dialog-overview-example.html',
  styleUrls: ['dialog-overview-example.css'],
})
export class DialogOverviewExample {

  @HostListener('document:click', ['$event'])
  clickout(event) {
    if (this.clickoutHandler) {
      this.clickoutHandler(event);
    }
  }

  animal: string;
  name: string;

  clickoutHandler: Function;

  dialogRef: MatDialogRef<DialogOverviewExampleDialog>;

  constructor(public dialog: MatDialog) {}

  openDialog(): void {
    setTimeout(() => {
      this.dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
        width: '250px',
        hasBackdrop: false
      });

      this.dialogRef.afterOpened().subscribe(() => {
        this.clickoutHandler = this.closeDialogFromClickout;
      });

      this.dialogRef.afterClosed().subscribe(() => {
        this.clickoutHandler = null;
      });
    });
  }

  closeDialogFromClickout(event: MouseEvent) {
    const matDialogContainerEl = this.dialogRef.componentInstance.hostElement.nativeElement.parentElement;
    const rect = matDialogContainerEl.getBoundingClientRect()
    if(event.clientX <= rect.left || event.clientX >= rect.right || 
        event.clientY <= rect.top || event.clientY >= rect.bottom) {
      this.dialogRef.close();
    }
  }
}

@Component({
  selector: 'dialog-overview-example-dialog',
  templateUrl: 'dialog-overview-example-dialog.html',
})
export class DialogOverviewExampleDialog {

  constructor(
    public hostElement: ElementRef,
    public dialogRef: MatDialogRef<DialogOverviewExampleDialog>,
    @Inject(MAT_DIALOG_DATA) public data: DialogData) {
  }

  onNoClick(): void {
    this.dialogRef.close();
  }
}
Run Code Online (Sandbox Code Playgroud)