Modals

Inline Modal

<ion-content [fullscreen]="true" class="ion-padding">

    <ion-button id="open-modal">Open Modal</ion-button>

    <p>{{ message }}</p>

    <ion-modal trigger="open-modal" (willDismiss)="onWillDismiss($event)">

        <ng-template>

            <ion-content class="ion-padding"> ... </ion-content>

            <ion-footer class="grid-0 cols-2">
                <ion-button slot="end" (click)="cancel()" fill="outline">Cancel</ion-button>
                <ion-button slot="end" (click)="confirm()" [strong]="true">Confirm</ion-button>
            </ion-footer>

        </ng-template>

    </ion-modal>

</ion-content>

Controller Modal

Create the modal page and remove the automatically created route. For this example, we are going to create a user-profile modal.

ionic generate page user-profile

1. Import the newly crated UserProfilePage and ModalController
import { ModalController } from '@ionic/angular';
import { UserPage } from './user/user.page';

2. Inject the ModalController into the constructor

Injecting the ModalController into the page.ts constructor gives us access to the ModalController within the class.

3. Create an async method to display the modal passing in the component and componentProps

The component parameter defines the page/component that will be displayed in the modal

componentProps is where you pass values to the modal. The value is passed as an object that has a property and a value.

Don't forget to return modal.present(); to display the modal

async editProfile() {

    const modal = await this.modal.create({
        component: UserPage,
        componentProps: { editing: true }
    })

    modal.onDidDismiss()
        .then((res) => {
            // the magic that happens when the modal is closed
        });

    return modal.present();
}

Call the modal with a click event
<ion-tab-button (click)="editProfile()">
    <ion-icon src="/assets/svg/user.svg"></ion-icon>
</ion-tab-button>

Closing the modal

*.ts

cancel() {
    this.modal.dismiss(null, 'cancel');
}

*.html

<ion-button (click)="cancel()" >Cancel</ion-button>

Layout Examples (HTML)

There is some quirky behaviour with the styling so you may need to play around to get the look and feel you want.

ion-content is intended to be used in full-page modals, cards, and sheets. If your custom dialog has a dynamic or unknown size, ion-content should not be used.

.ion-page uses display: flex; justify-content: space-between;

Header with title and buttons

<ion-content class="ion-padding">

    <ion-button id="open-modal" expand="block">Open</ion-button>

    <ion-modal trigger="open-modal" (willDismiss)="onWillDismiss($event)">
        <ng-template>
            <ion-header>
                <ion-toolbar>
                    <ion-buttons slot="start">
                        <ion-button (click)="cancel()">Cancel</ion-button>
                    </ion-buttons>
                    <ion-title>Title</ion-title>
                    <ion-buttons slot="end">
                        <ion-button (click)="confirm()" [strong]="true">Confirm</ion-button>
                    </ion-buttons>
                </ion-toolbar>
            </ion-header>

            <!-- only wrap in ion-content for full page modal -->
            <ion-card class="ion-padding"> ... </ion-card>

        </ng-template>
    </ion-modal>

</ion-content>