我目前正在处理 Angular 4 项目的密码重置页面。我们使用 Angular Material 来创建对话框,但是,当客户端点击离开对话框时,它会自动关闭。有没有办法避免对话框关闭,直到我们的代码端调用“关闭”函数?或者我应该如何创建一个 不可关闭 的模式?
有两种方法可以做到这一点。
在打开对话框的方法中,将以下配置选项disableClose作为第二个参数传入MatDialog#open()并将其设置为true:
disableClose
MatDialog#open()
true
export class AppComponent {
constructor(private dialog: MatDialog){} openDialog() { this.dialog.open(DialogComponent, { disableClose: true }); } }
或者,在对话框组件本身中执行此操作。
export class DialogComponent {
constructor(private dialogRef: MatDialogRef){ dialogRef.disableClose = true; } }
这是您要查找的内容:
这是一个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(); } }
PS 这是一个源于这个答案的答案,演示是基于这个答案。
为了防止esc键关闭对话框但允许单击背景关闭,我调整了 Marc 的答案,以及MatDialogRef#backdropClick用于侦听背景的点击事件。
MatDialogRef#backdropClick
最初,对话框将配置选项disableClose设置为true. 这确保了esc按键以及单击背景不会导致对话框关闭。
之后,订阅该MatDialogRef#backdropClick方法(当背景被点击时发出并以 a 形式返回MouseEvent)。
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(); }) } }