Создание диалоговых окон на Angular Material
Development | Комментировать запись
В Angular Material существует множество доступных компонентов, и диалоговые окна – самые сложные из них.
В этом мануале мы создадим простое диалоговое окно, которое предложит пользователям выбрать эмодзи.
Сначала вы должны убедиться, что Angular Material правильно настроен для разработки вашего проекта. Кроме того, предполагается, что у вас есть проект, запущенный с помощью Angular CLI.
Читайте также:
Компоненты для диалоговых окон
В Angular Material диалоговые окна являются отдельными компонентами, поэтому нашим первым шагом будет создание компонента. В Angular CLI можно запустить следующее:
$ ng g component choose-emoji-dialog
Импорт компонента диалогового окна
Затем нужно импортировать компонент диалогового окна в модуль вашего приложения и в компонент, который будет его вызывать. Также компонент нужно добавить в объявления и входные компоненты внутри модуля приложения (app.module.ts):
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MaterialModule } from '@angular/material'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { AppComponent } from './app.component'; import { ChooseEmojiDialogComponent } from './choose-emoji-dialog/choose-emoji-dialog.component';
Импорт и инъекция MdDialog
Внутри главного компонента приложения (app.component.ts, который и вызывает диалоговое окно) мы должны импортировать MdDialog и инжектировать его в конструктор класса:
import { Component } from '@angular/core'; import { ChooseEmojiDialogComponent } from './choose-emoji-dialog/choose-emoji-dialog.component'; import { MdDialog } from '@angular/material'; @Component({ selector: 'app-root', template: <h1>Your Emoji</h1> <div *ngIf="selectedEmoji">{{ selectedEmoji }}</div> <button mat-raised-button (click)="openEmojiDialog()"> Make a selection </button>, styles: [div { padding: 1rem; }] }) export class AppComponent { selectedEmoji: string; constructor(public dialog: MdDialog) {} openEmojiDialog() { let dialog = this.dialog.open(ChooseEmojiDialogComponent); dialog.afterClosed() .subscribe(selection => { if (selection) { this.selectedEmoji = selection; } else { // User clicked 'Cancel' or clicked outside the dialog } });
Пара примечаний:
- Мы открываем диалоговое окно, вызывая open для внедренного экземпляра MdDialog и передавая компонент диалогового окна.
- Мы получаем данные из диалогового окна, подписавшись на наблюдаемый объект, который возвращает afterClosed, и извлекая данные.
Стилизация диалогового окна
Данный компонент довольно прост, и Angular Material предоставляет нам несколько директив, помогающих стилизовать его элементы. Вот разметка шаблона (choose-emoji-dialog.html):
<h1 mat-dialog-title>Choose Your Destiny:</h1> <div mat-dialog-content> <mat-select [(ngModel)]="choosenEmoji"> <mat-option *ngFor="let emoji of emojis" [value]="emoji"> {{ emoji }} </mat-option> </mat-select> </div> <div mat-dialog-actions> <button mat-button (click)="confirmSelection()" color="primary"> Okays! </button> <button mat-button (click)="dialogRef.close()"> Cancel </button> </div>
Обратите внимание на несколько специальных директив, которые мы использовали: mat-dialog-title, mat-dialog-content и mat-dialog-actions.
Чтобы кнопки действий в диалоговом окне работали правильно, необходимо импортировать MdDialogRef и внедрить его в конструктор, чтобы создать ссылку на диалоговое окно (choose-emoji-dialog.component.ts):
import { Component } from '@angular/core'; import { MdDialogRef } from '@angular/material'; @Component({ selector: 'app-choose-emoji-dialog', templateUrl: './choose-emoji-dialog.component.html' }) export class ChooseEmojiDialogComponent { emojis = ['🐼', '💪', '🐷', '🤖', '👽', '🐥']; choosenEmoji: string; constructor(public dialogRef: MdDialogRef<ChooseEmojiDialogComponent>) { } confirmSelection() { this.dialogRef.close(this.choosenEmoji); }
Метод confirmSelection закрывает диалоговое окно, а также возвращает нужные нам данные.
В итоге у нас есть красивое диалоговое окно Material Design: