Of all of the Angular Materials parts, the MatDialog simply stands out as the most complicated. On the identical time, it’s most likely additionally probably the most versatile of the bunch. A part of the reason being that it’s not a element a lot as a service that may be utilized to open modal dialogs with Materials Design styling and animations. On this tutorial, we’ll exchange the usual JavaScript affirm dialog that we carried out within the Stopping Information Loss In Angular Purposes utilizing a CanDeactivate Route Guard tutorial with a MatDialog:
JavaScript Verify Dialog
Angular Verify Dialog
Including MatDialog to the Materials Module File
Recall that we positioned all of our Angular Materials imports within the srcappsharedmodules
import {MatDialogModule} from '@angular/materials/dialog'; const materialModules = [ //... MatToolbarModule, MatDialogModule ];
Creating the ConfirmDialog Part
A part of what makes MatDialog so versatile is that its open() methodology accepts a element to point out within the physique of the dialog. You is likely to be tempted to create the element as a toddler to the one that may name it, however it is likely to be sensible to assume twice earlier than doing in order we could wish to reuse the identical dialog elsewhere inside out utility sooner or later. For that motive, I might advocate producing it inside the app listing:
ng g c confirm-dialog
Within the confirm-dialog.element.ts file, we are going to modify the constructor to just accept a reference to the dialog in addition to the info that we are going to cross to it:
import { Part, Inject, ViewEncapsulation } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/materials/dialog'; @Part({ selector: 'app-confirm-dialog', templateUrl: './confirm-dialog.element.html', styleUrls: ['./confirm-dialog.component. css'], // it will enable us to override the mat-dialog-container CSS class encapsulation: ViewEncapsulation.None }) export class ConfirmDialogComponent { constructor( public dialogRef: MatDialogRef< ConfirmDialogComponent>, @Inject(MAT_DIALOG_DATA) public knowledge: any) { } }
Subsequent, we’ll add the contents of the dialog to the confirm-dialog.element.html file:
<div class="dialog-header accent-background"> <span class="dialog-header-title">{{knowledge.dialogTitle}}</span> </div> <div class="dialog-content"> <p>{{knowledge.dialogMessageLine1}} <br/> {{knowledge.dialogMessageLine2}}</ p> </div> <div class="dialog-footer"> <button class="standard-button dialog-button" mat-raised-button [mat-dialog-close]="false" cdkFocusInitial>{{knowledge. noButtonText}}</button> <button mat-raised-button colour="main" [mat-dialog-close]="true">{{ knowledge.yesButtonText}}</button> </div>
Invoking the MatDialog Service
Again within the survey.element.ts file, we’re able to replace the canExit() methodology to current our customized dialog as an alternative of the native JavaScript affirm dialog. There are three issues we have to do to make that occur:
- Add a constructor that accepts a MatDialog reference.
- Add the openUnsavedChangesDialog() methodology. It’s accountable for displaying the dialog.
- Invoke the openUnsavedChangesDialog() methodology from canExit().
Right here is the up to date supply code for the survey.element.ts file that reveals the related adjustments:
// imports import { MatDialog } from "@angular/materials/dialog"; import { ConfirmDialogComponent } from "../confirm-dialog/confirm-dialog.element"; // SatisfactionRatings enum @Part({ selector: "app-survey", templateUrl: "./survey.element.html", styleUrls: ["./survey.component.css"] }) export class SurveyComponent implements IDeactivateComponent { // declarations constructor(public dialog: MatDialog) { } //strategies... public canExit(): boolean | Observable<boolean> { return this.ngFormRef.soiled ? this.openUnsavedChangesDialog( ) : true; }; personal openUnsavedChangesDialog(): Observable<boolean> { const dialogRef = this.dialog.open( ConfirmDialogComponent, { width: '26.5rem', knowledge: { dialogTitle: 'Unsaved Adjustments', dialogMessageLine1: 'You've gotten unsaved adjustments.', dialogMessageLine2: 'Are you positive you need to depart the web page?', yesButtonText: 'Go away this Web page', noButtonText: 'Keep on this Web page' } }); return dialogRef.afterClosed(); } }
The openUnsavedChangesDialog() Technique Defined
There’s quite a bit happening on this little methodology, so let’s unpack it.
The dialog reference that we injected by way of the constructor offers quite a few strategies, properties, and occasion hooks for working with it, crucial of which being the open() methodology. It accepts the element to show in addition to a MatDialogConfig object. That’s the place we set the dialog’s look and cross alongside the info object that populates the dialog element.
Organizations should transcend a piecemeal strategy to networking and safety. A broad, built-in, and automatic platform that secures all edges addresses challenges now and sooner or later.
The afterClosed() occasion hook receives an observable that’s notified when the dialog is completed closing. We will do no matter processing we have to do after the dialog is closed. In our case, we don’t must do something however cross alongside the worth returned by the dialog. That will get set by the 2 buttons within the footer by way of the certain [mat-dialog-close] attribute:
<div class="dialog-footer"> <button class="standard-button dialog-button" mat-raised-button [mat-dialog-close]="false" cdkFocusInitial>{{knowledge.noButtonText}}</button> <button mat-raised-button colour="main" [mat-dialog-close]="true">{{ knowledge.yesButtonText}}</button> </div>
We then want so as to add the Observable<boolean> return sort to canExit() to accommodate the afterClosed() return worth.
Right here’s the tip results of at present’s updates to the Stopping Information Loss In Angular Purposes utilizing a CanDeactivate Route Guard demo. To check it, navigate to the Survey web page, work together with the shape in order to replace the underlying mannequin, after which click on the Residence hyperlink:
Conclusion
On this tutorial, we discovered easy methods to use the MatDialog, probably the most complicated, and but most versatile Angular Materials element. To do this, we changed the usual JavaScript affirm dialog that we carried out within the Stopping Information Loss In Angular Purposes utilizing a CanDeactivate Route Guard demo with a MatDialog.