現在、Angular 4プロジェクトのパスワードリセットページで作業しています。 Angular Materialを使用してダイアログを作成しますが、クライアントがダイアログからクリックすると、自動的に閉じます。コード側が「close」関数を呼び出すまで、ダイアログが閉じるのを回避する方法はありますか?または、閉じられないモーダルを作成するにはどうすればよいですか?
それを行うには2つの方法があります。
ダイアログを開くメソッドで、次の構成オプションdisableClose
をMatDialog#open()
の2番目のパラメーターとして渡し、true
に設定します。
export class AppComponent {
constructor(private dialog: MatDialog){}
openDialog() {
this.dialog.open(DialogComponent, { disableClose: true });
}
}
または、ダイアログコンポーネント自体で実行します。
export class DialogComponent {
constructor(private dialogRef: MatDialogRef<DialogComponent>){
dialogRef.disableClose = true;
}
}
探しているものは次のとおりです。
そして、これが Stackblitzデモ です
以下に、他の使用例とそれらの実装方法のコードスニペットを示します。
@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();
}
}
追伸これは this answer に由来する回答であり、デモはこの回答に基づいていました。
防ぐために esc キーを押してダイアログを閉じますが、背景をクリックして閉じることを許可します。Marcの答えを採用し、MatDialogRef#backdropClick
を使用して背景へのクリックイベントをリッスンしました。
最初は、ダイアログの構成オプションdisableClose
がtrue
として設定されます。これにより、esc
キーを押しても、背景をクリックしてもダイアログが閉じません。
その後、MatDialogRef#backdropClick
メソッドにサブスクライブします(このメソッドは、背景がクリックされたときに発生し、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();
})
}
}
これは私のために働く
openDialog() {
this.dialog.open(YourComponent, { disableClose: true });
}
私はこれが数年前であることを知っていますが、backdrop: 'static'
を使用して外部クリックを無効にし、keyboard: false
を使用してエスケープを無効にすることはできませんか?
Docs モーダルセクションまでスクロールします。 Angular 4+に適していると確信しています。
Mehの例:
import { BsModalRef, BsModalService } from "ngx-bootstrap/modal";
@Component({
// Setup stuff..
})
export class ModalExample {
modalRef: BsModalRef;
constructor(
private modalService: BsModalService,
) { }
ngOnInit(): void {
}
public openConfirmationModal(submitClaimResult: SubmitDealerClaimResult) {
this.modalRef = this.modalService.show({backdrop: 'static', keyboard: false });
}
}