【Angular Material】入力ダイアログを作ろう!

ANGULAR

みなさんこんにちは、現役エンジニアのサメハックです

未経験からWebエンジニアに転職し、
正社員として5年働いたのちフリーランスとして独立しました。

Angularの解説シリーズです。

今回はAngular Materialで入力ダイアログを作る方法について学んでいきましょう!

駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!

この記事を読むと・・・
  • AngularMaterialを使って入力ダイアログが作成できる

※PCにnpm、nodeがインストールされている前提で記述します。
 yarn等をお使いの方は読み替えてください。

環境がない人はcodesansbox等を使ってね!

作りたいもの

■ボタンを押下

■OKを押下
これが今回の完成形だよ!

実行環境

Angularのバージョンが古いと動かないことがあるよ!
うまく動かなければアップデートしてね!

Angular Materialで入力ダイアログを作ろう!

Angular Materialで入力ダイアログを作る構文

ダイアログ

<button [mat-dialog-close]="親コンポーネントに返すデータ">OK</button>
<button (click)="cancel()" cdkFocusInitial>キャンセル</button>
cdkFocusInitialをつけるとデフォルトでフォーカスを当てることができるよ!

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

constructor(
  public dialogRef: MatDialogRef<ダイアログコンポーネント名>,
  @Inject(MAT_DIALOG_DATA) public data: any
) {}
ダイアログコンポーネント名は自分自身のコンポーネント名になるよ!

親コンポーネント※呼び出し側

openDialog() {
  const dialogRef = this.dialog.open(ダイアログコンポーネント名, {data: {渡したいデータ}});

  // ダイアログクローズを検知
  dialogRef.afterClosed().subscribe((ダイアログから受け取るデータ) => {});
}
ちょっとわかりにくいので、次項の実際のコードを見てみてね!

実際に作ってみよう!

初期設定

ng new my-app
cd my-app
ng generate component my-dialog
ng serve -o

Angular Materialのインストール

ng add @angular/material
テーマカラーとアニメーションは好きな項目を選択してね!

app.component.html

<button (click)="openDialog()">入力ダイアログオープン</button>

app.component.ts

import { Component } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MyDialogComponent } from './my-dialog/my-dialog.component';

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

  openDialog(): void {
    // ダイアログを開く※引数を渡すことも可
    const dialogRef = this.dialog.open(MyDialogComponent, {
      data: { title: 'あなたの名前' },
    });

    // ダイアログが閉じたら受け取る
    dialogRef.afterClosed().subscribe((response) => {
      console.log('ダイアログが閉じられました');
      if (response) {
        console.log('OKが押されました 名前', response);
      } else {
        // resultはundefined
        console.log('キャンセルが押されました');
      }
    });
  }
}

app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MyDialogComponent } from './my-dialog/my-dialog.component';
import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';

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

my-dialog.comopnent.html

<p>{{ data.title }}を入力してください</p>
<div>
  <!-- [mat-dialog-close]に渡した値を呼び出し元に返す -->
  <input type="text" [(ngModel)]="myText" />
  <button [mat-dialog-close]="myText">OK</button>
  <button (click)="cancel()" cdkFocusInitial>キャンセル</button>
</div>

my-dialog.comopnent.ts

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

@Component({
  selector: 'app-my-dialog',
  templateUrl: './my-dialog.component.html',
  styleUrls: ['./my-dialog.component.scss'],
})
export class MyDialogComponent {
  // データ返却用
  myText: string;

  constructor(
    public dialogRef: MatDialogRef,
    @Inject(MAT_DIALOG_DATA) public data: any
  ) {}

  // キャンセルボタン
  cancel(): void {
    this.dialogRef.close();
  }
}
これで入力内容を親コンポーネントへ返す入力ダイアログが作成できたよ!

GitHubのサンプルコード

今回作ったものはGitHubにあげているので
使いたい人は是非ダウンロードしてみてください。

GitHub - same-hack/Angular-material-input-dialog
Contribute to same-hack/Angular-material-input-dialog development by creating an account on GitHub.

満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈

タイトルとURLをコピーしました