[解決済み] Angular Materialダイアログエリアの外をクリックしてダイアログを閉じないようにする(Angularバージョン4.0以上で使用可能)
質問
現在、Angular4のプロジェクトでパスワードリセットのページを作成しています。Angular Materialを使用してダイアログを作成していますが、クライアントがダイアログをクリックすると、自動的に閉じてしまいます。私たちのコード側が"close"関数を呼び出すまで、ダイアログが閉じるのを避ける方法はありますか?あるいは、どのように 開閉不能 モーダル?
解決方法は?
2つの方法があります。
-
ダイアログを開くメソッドで、次の設定オプションを渡します。
disableClose
の2番目のパラメータとしてMatDialog#open()
に設定し、それを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が言っているように、このメソッドは エスケープ キーでモーダルを閉じますが、モーダル外のクリックは許可されません。このコードをダイアログ コンポーネントで使用してください。
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();
}
}
防止する エスケープ をクリックするとダイアログが閉じますが、背景をクリックすると閉じることができます。
<ブロッククオート追伸:この回答は、以下のサイトからのものです。 この回答 このデモは、この回答を元に作成されました。
を防ぐために
エスケープ
キーでダイアログを閉じることはできないが、背景をクリックすれば閉じることができるようにするため、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();
})
}
}
関連
-
Angularフレームワーク入門
-
[解決済み] Twitter Bootstrapのモーダルクローズに関数をバインドする
-
[解決済み] Bootstrapのモーダルを閉じる
-
[解決済み] OpenFileDialogを使用してフォルダを選択するには?
-
[解決済み] ngIf」は「div」の既知のプロパティではないため、バインドできない [重複] 。
-
[解決済み] Angularのルーティングされたコンポーネントにデータを渡すにはどうしたらいいですか?
-
[解決済み] Angular 2.0のルーターがブラウザーの再読み込みで動作しない件
-
[解決済み] Angular + Material - データソース(mat-table)を更新する方法
-
[解決済み] AngularでngFor repeatをある数のアイテムに制限するにはどうすればよいですか?
-
[解決済み] ジョブ名「...getProjectMetadata」は存在しません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular [disabled]="MyBoolean "が動作しない。
-
[解決済み] インデックスを属性値とするngFor
-
[解決済み] 予算内の警告、初期値で最大値を超える
-
[解決済み] Angularのルーティングされたコンポーネントにデータを渡すにはどうしたらいいですか?
-
[解決済み】プロパティ「of」が「typeof Observable」型に存在しない【重複
-
[解決済み】エラー NG6002: AppModule の NgModule.imports に表示されるが、NgModule クラスに解決できなかった。
-
[解決済み] NgModule.schemasにCUSTOM_ELEMENTS_SCHEMAを追加してもエラーが表示される。
-
[解決済み] Angular Materialダイアログエリアの外をクリックしてダイアログを閉じないようにする(Angularバージョン4.0以上で使用可能)
-
[解決済み] @angular/material/index.d.ts' はモジュールではありません。
-
[解決済み] ES6/Typescriptでアロー関数と_(アンダースコア)変数を使用する