In this tutorial, we’ll build by example a modal popup using Angular 10 Material.

Angular Material provides modern UI components for building user interfaces based on the material design specification that works across the web, mobile, and desktop.

Step 1: Creating an Angular 10 Project

Open a new command-line interface and run the following command:

$ ng new angular-modal-example

Step 2: Installing and Setting up Angular 10 Material

Navigate inside the project’s folder and begin by installing hammerjs as follows:

$ cd angular-modal-example
$ npm install --save hammerjs

Hammer.js adds support for touch support.

Next, install Angular Material and Angular Animations using the following commands:

$ npm install --save @angular/material @angular/animations @angular/cdk

Now, include hammerjs in the angular.json file.

Step 3: Creating the Custom Material Module File

Navigate to the src/app folder, create one module file named material.module.ts:

$ cd src/app
$ touch material.module.ts

Open the src/app/material.module.ts file and update it as follows:

import { NgModule } from '@angular/core';

import { MatDialogModule, MatFormFieldModule, MatButtonModule, MatInputModule } from '@angular/material';
import { FormsModule } from '@angular/forms';

@NgModule({
  exports: [FormsModule, MatDialogModule, MatFormFieldModule, MatButtonModule, MatInputModule]
})
export class MaterialModule {}

Step 4: Importing a Theme and Material Icons

Angular Material provides many pre-built themes. Open the styles.css file and add:

@import '~@angular/material/prebuilt-themes/indigo-pink.css';

Next open the index.html file and add:

<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">

Next, open the src/app/app.module.ts file and import the material.module.ts and BrowserAnimationsModule:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MaterialModule } from './material.module';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, BrowserAnimationsModule, MaterialModule],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

Step 5: Implementing the Angular 10 Material Modal Dialog

Now, open the src/app.component.ts file, and import MatDialog, MatDialogRef, MAT_DIALOG_DATA:

import { Component, Inject } from '@angular/core';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';

interface DialogData {
  email: string;
}

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
}

Next, create an Angular component by running the following command from the root of your project:

ng generate component modal --module app --spec=false

Openn the src/app/modal/modal.component.ts file and update it as follows:

import { Component, OnInit, Inject } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';

interface DialogData {
  email: string;
}

@Component({
  selector: 'app-modal',
  templateUrl: './modal.component.html',
  styleUrls: ['./modal.component.css']
})
export class ModalComponent implements OnInit {

  constructor(
    public dialogRef: MatDialogRef<ModalComponent>,
    @Inject(MAT_DIALOG_DATA) public data: DialogData) {}

  onNoClick(): void {
    this.dialogRef.close();
  }

  ngOnInit() {
  }
}

Open the src/app/modal/modal.component.html file and add the following markup:

<h1 mat-dialog-title>Want to receive our emails?</h1>
<div mat-dialog-content>
  <p>What's your email?</p>
  <mat-form-field>
    <input matInput [(ngModel)]="data.email">
  </mat-form-field>
</div>
<div mat-dialog-actions>
  <button mat-button (click)="onNoClick()">No</button>
  <button mat-button [mat-dialog-close]="data.email" cdkFocusInitial>Yes</button>
</div>

Next, open the src/app/app.component.ts file and update it as follows:

import { Component, Inject } from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
import { ModalComponent } from './modal/modal.component';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  email: string;

  constructor(public dialog: MatDialog) {}

  openDialog(): void {
    const dialogRef = this.dialog.open(ModalComponent, {
      width: '300px',
      data: {}
    });

    dialogRef.afterClosed().subscribe(result => {
      this.email = result;
    });
  }
}

First, we importe the modal component in the src/app/app.component.ts file, next we defined the openDialog() method which opens the ModalComponent

When the user closes the modal component, the App component receives the value of the email entered in ModalComponent.

Next, open the src/app/app.component.html file and the following markup:

<div>

      <button mat-raised-button (click)="openDialog()">Open modal</button>

    <br />
    <div *ngIf="email">
      You signed up with: <p></p>
    </div>
</div>

Open the src/app/app.module.ts file and add the modal component inside the entryComponents array of the module as follows:


import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MaterialModule } from './material.module';

import { AppComponent } from './app.component';
import { ModalComponent } from './modal/modal.component';

@NgModule({
  declarations: [AppComponent, ModalComponent],
  imports: [BrowserModule, BrowserAnimationsModule, MaterialModule],
  providers: [],
  bootstrap: [AppComponent],
  entryComponents: [ModalComponent]
})
export class AppModule {}

That’ it, let’s now test our modal dialog by serving our Angular appliaction from the terminal:

$ ng serve 

The server will be running from the http://localhost:4200.

Conclusion

In this quick example, we have created a popup modal dialog with Angular Material and Angular 10.

In the same series: