小编典典

禁用在角度材料对话框区域外单击以关闭对话框(使用 Angular 版本 4.0+)

all

我目前正在处理 Angular 4 项目的密码重置页面。我们使用 Angular Material
来创建对话框,但是,当客户端点击离开对话框时,它会自动关闭。有没有办法避免对话框关闭,直到我们的代码端调用“关闭”函数?或者我应该如何创建一个 不可关闭
的模式?


阅读 68

收藏
2022-07-30

共1个答案

小编典典

有两种方法可以做到这一点。

  1. 在打开对话框的方法中,将以下配置选项disableClose作为第二个参数传入MatDialog#open()并将其设置为true

    export class AppComponent {
    

    constructor(private dialog: MatDialog){}
    openDialog() {
    this.dialog.open(DialogComponent, { disableClose: true });
    }
    }

  2. 或者,在对话框组件本身中执行此操作。

    export class DialogComponent {
    

    constructor(private dialogRef: MatDialogRef){
    dialogRef.disableClose = true;
    }
    }

这是您要查找的内容:

material.angular.io 中的 <code>disableClose</code>
属性

这是一个Stackblitz 演示


其他用例

这是其他一些用例和如何实现它们的代码片段。

允许esc关闭对话框,但不允许点击背景关闭对话框

正如@MarcBrazeau 在我的回答下方的评论中所说,您可以允许该esc键关闭模态,但仍不允许在模态外部单击。在您的对话框组件上使用此代码:

import { Component, OnInit, HostListener } from '@angular/core';
import { MatDialogRef } from '@angular/material';
@Component({
  selector: 'app-third-dialog',
  templateUrl: './third-dialog.component.html'
})
export class ThirdDialogComponent {
  constructor(private dialogRef: MatDialogRef<ThirdDialogComponent>) {      
}
  @HostListener('window:keyup.esc') onKeyUp() {
    this.dialogRef.close();
  }

}

防止esc关闭对话框,但允许单击背景关闭

PS 这是一个源于这个答案的答案,演示是基于这个答案。

为了防止esc键关闭对话框但允许单击背景关闭,我调整了 Marc
的答案,以及MatDialogRef#backdropClick用于侦听背景的点击事件。

最初,对话框将配置选项disableClose设置为true. 这确保了esc按键以及单击背景不会导致对话框关闭。

之后,订阅该MatDialogRef#backdropClick方法(当背景被点击时发出并以 a 形式返回MouseEvent)。

无论如何,足够的技术谈话。这是代码:

openDialog() {
  let dialogRef = this.dialog.open(DialogComponent, { disableClose: true });
  /*
     Subscribe to events emitted when the backdrop is clicked
     NOTE: Since we won't actually be using the `MouseEvent` event, we'll just use an underscore here
     See https://stackoverflow.com/a/41086381 for more info
  */
  dialogRef.backdropClick().subscribe(() => {
    // Close the dialog
    dialogRef.close();
  })

  // ...
}

或者,这可以在对话框组件中完成:

export class DialogComponent {
  constructor(private dialogRef: MatDialogRef<DialogComponent>) {
    dialogRef.disableClose = true;
    /*
      Subscribe to events emitted when the backdrop is clicked
      NOTE: Since we won't actually be using the `MouseEvent` event, we'll just use an underscore here
      See https://stackoverflow.com/a/41086381 for more info
    */
    dialogRef.backdropClick().subscribe(() => {
      // Close the dialog
      dialogRef.close();
    })
  }
}
2022-07-30