Tắt nhấp chuột bên ngoài khu vực hộp thoại vật liệu góc để đóng hộp thoại (Với Phiên bản Angular 4.0+)


103

Tôi hiện đang làm việc trên trang đặt lại mật khẩu của một dự án Angular 4. Chúng tôi đang sử dụng Angular Material để tạo hộp thoại, tuy nhiên, khi khách hàng nhấp ra khỏi hộp thoại, hộp thoại sẽ tự động đóng lại. Có cách nào để tránh đóng hộp thoại cho đến khi phía mã của chúng tôi gọi hàm "đóng" không? Hoặc làm thế nào tôi nên tạo một unclosable modal?

Câu trả lời:


267

Có hai cách để làm điều đó.

  1. Trong phương thức mở hộp thoại, hãy chuyển vào tùy chọn cấu hình sau disableCloselàm tham số thứ hai MatDialog#open()và đặt nó thành true:

    export class AppComponent {
      constructor(private dialog: MatDialog){}
      openDialog() {
        this.dialog.open(DialogComponent, { disableClose: true });
      }
    }
  2. Ngoài ra, hãy làm điều đó trong chính thành phần hộp thoại.

    export class DialogComponent {
      constructor(private dialogRef: MatDialogRef<DialogComponent>){
        dialogRef.disableClose = true;
      }
    }

Đây là những gì bạn đang tìm kiếm:

Thuộc tính <code> disableClose </code> trong material.angular.io

Và đây là bản demo của Stackblitz


Các trường hợp sử dụng khác

Dưới đây là một số trường hợp sử dụng khác và đoạn mã về cách triển khai chúng.

Cho phép escđóng hộp thoại nhưng không cho phép nhấp vào phông nền để đóng hộp thoại

Như những gì @MarcBrazeau đã nói trong nhận xét bên dưới câu trả lời của tôi, bạn có thể cho phép esckhóa để đóng phương thức nhưng vẫn không cho phép nhấp bên ngoài phương thức. Sử dụng mã này trên thành phần hộp thoại của bạn:

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();
  }

}

Ngăn escđóng hộp thoại nhưng cho phép nhấp vào phông nền để đóng

Tái bút Đây là một câu trả lời bắt nguồn từ câu trả lời này , nơi demo dựa trên câu trả lời này.

Để ngăn esckhóa đóng hộp thoại nhưng cho phép nhấp vào phông nền để đóng, tôi đã điều chỉnh câu trả lời của Marc, cũng như sử dụng MatDialogRef#backdropClickđể lắng nghe các sự kiện nhấp chuột vào phông nền.

Ban đầu, hộp thoại sẽ có tùy chọn cấu hình disableCloseđược đặt như true. Điều này đảm bảo rằng việc escnhấn phím, cũng như nhấp vào phông nền sẽ không khiến hộp thoại bị đóng.

Sau đó, đăng ký MatDialogRef#backdropClickphương thức (phát ra khi phông nền được nhấp và trả về dưới dạng a MouseEvent).

Dù sao, đủ kỹ thuật nói chuyện. Đây là mã:

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();
  })

  // ...
}

Ngoài ra, điều này có thể được thực hiện trong thành phần hộp thoại:

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();
    })
  }
}

5
Tôi thực sự thấy khó chịu khi bạn phải tắt cả "thoát và nhấp vào bên ngoài". Để giải quyết vấn đề này:@HostListener('window:keyup.esc') onKeyUp() { this.dialogRef.close(); }
Marc Brazeau

@MarcBrazeau Tôi đã thêm nhận xét của bạn vào câu trả lời của mình.
Edric

1
Một cảnh báo cho những người sử dụng các trường đầu vào có tính năng tự động điền. Sử dụng HostListener sẽ đóng hộp thoại khi bạn đóng danh sách tự động hoàn thành.
Jompis

Cảm ơn sự giúp đỡ của bạn
Rafael Moura

1
Bạn cũng sẽ cần xử lý việc hủy đăng ký khỏi phông nềnClick Observable nếu không bạn sẽ bị rò rỉ bộ nhớ.
nghiệt ngã

3

Làm thế nào về việc chơi với hai tài sản này?

disableClose: boolean - Liệu người dùng có thể sử dụng Escape hoặc nhấp vào phông nền để đóng phương thức hay không.

hasBackdrop: boolean - Hộp thoại có phông nền hay không.

https://material.angular.io/components/dialog/api


thiết hasBackdrop để loại bỏ việc sai sự làm đen của khu vực bên ngoài hộp thoại
Mohit Atray

Làm việc với Angular 9. 'hasBackdrop' không cho phép người dùng tương tác với các yếu tố bên ngoài khác. disableClose không cho phép người dùng đóng hộp thoại bằng phím bấm bên ngoài hoặc phím thoát.
Naveen Kumar V
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.