ここ最近仕事でもプライベートでも使っているAngularですが、さすが新しい技術だけあってある程度の要素(例えばフォーム部品など)が揃っているものの、開発を進めていくうちに「あれ、標準じゃこれ出来ないな」という壁にぶち当たることもあります。

そうした際に真っ先に思い浮かぶのが、外部パッケージによる解決です。

今回はAngular開発時に、UIコンポーネントを提供してくれる『Angular Material』というパッケージのご紹介。

開発環境
  • OS:Windows10 Pro
  • Node.js:v12.16.3
  • npm:6.14.4
  • Angular CLI:9.1.4

『Angular Material』とは

Angularを開発するGoogleが提供している、Angular用のコンポーネント(要素という意味で)です。

Angular標準で用意されているフォーム部品の他に、便利な部品を多数提供してくれるパッケージですね。

検索エンジンから多岐にわたるサービスを提供しているGoogleが開発しているだけあって、パッケージが提供する部品はどれも洗練されているのも特徴の一つです。

一つだけ難点があるとすれば、Angular公式は日本語のドキュメントが整備されていますが、Angular Materialでは日本語のドキュメントが存在しません。

Chromeであればブラウザ右クリックで日本語翻訳にすることも可能ですが、それ程うまくは変換してくれません。

まぁ、開発者なら英語ベースでも大丈夫でしょう。

Angular Materialの公式サイトはコチラです。

Angular Materialのインストール

Angular MaterialはAngular公式のパッケージでありながら、標準機能ではありません。

なので、Angularのインストール後に追加でインストールが必要になります。

※今回はAngularのインストールおよび新規プロジェクト作成までは省略します。

作成したプロジェクトを「ng serve」コマンドで立ち上げ、アクセスすると下記のような画面が開きます。

※2020年5月時点(少し前の記事だと、初回起動時の画面は少し異なります。)

上記画面の「Next Steps」にAngular Materialのボタンが見ているのでこちらをクリックします。

すると画面下部に、Angular Materialのインストールを行うコマンドが表示されます。

開発元が同じ(あるいは連携している)というのはこういうところで便利ですよね。

ということで、下記のコマンドをプロジェクトフォルダで実行します。

ng add @angular/material

するとすぐに下記画像のような質問に答える必要があります。

内容としては、「テーマどうしますか?」という単純なモノ。

「スタイルのイメージが沸かない」という方は、Angular Material公式より各スタイルを確認することが出来ますので、こちらでイメージを掴んでから選択するといいでしょう。

その後もいくつか質問が飛んできますが、おおむねYesで問題ないでしょう。

これでAngular Materialのパッケージインストールは完了です。

Angular Materialの使用方法

続いて、Angular Materialのテーブルコンポーネントを例に、Angular Material公式に準拠して使い方を紹介していきます。

今回はひとまずプロジェクト作成時に一緒に作られる、app.componentを使っていきます。(以後もそうかもしれませんが…)

AppModuleへの追加

パッケージインストールが完了し「さて、画面のコーディングに着手するか」となる前に、Angular Materialを利用するにはもうひと手間、Xamarin+Prismで言うところの、XAMLにおけるPrismの宣言みたいなモノ、が必要になります。

それがapp.module.tsへのインポート及び、モジュールインポート(呼び方は気にしない)の追加です。

という事で早速下記のコードを追加します。

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

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatTableModule } from '@angular/material/table';   ★追加

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    MatTableModule                                          ★追加
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

以上のコードを追加することで、Angular Materialのテーブルコンポーネントをプロジェクト内で使用できることになりました。

※Angular Materialのコンポーネント一つにつき上記のように2行ずつ増えていくので、実際の開発ではAngular Material用のModuleを用意し、Angular Materialのモジュールインポートは全て専用のModuleに追記していく方式が分かりやすいかと思います。

HTMLの作成

ここからはAngular Material公式準拠の所なので、コードと簡単な説明だけしておきます。

app.component.htmlを下記の通り書き換えます。

<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">

  <!--- Note that these columns can be defined in any order.
        The actual rendered columns are set as a property on the row definition" -->

  <!-- Position Column -->
  <ng-container matColumnDef="position">
    <th mat-header-cell *matHeaderCellDef> No. </th>
    <td mat-cell *matCellDef="let element"> {{element.position}} </td>
  </ng-container>

  <!-- Name Column -->
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef> Name </th>
    <td mat-cell *matCellDef="let element"> {{element.name}} </td>
  </ng-container>

  <!-- Weight Column -->
  <ng-container matColumnDef="weight">
    <th mat-header-cell *matHeaderCellDef> Weight </th>
    <td mat-cell *matCellDef="let element"> {{element.weight}} </td>
  </ng-container>

  <!-- Symbol Column -->
  <ng-container matColumnDef="symbol">
    <th mat-header-cell *matHeaderCellDef> Symbol </th>
    <td mat-cell *matCellDef="let element"> {{element.symbol}} </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

この時点で変数部分ではなくタグやタグのプロパティ部分にビルドエラーが発生している場合、先ほどのモジュールインポートがうまくいっていない可能性があります。

処理の作成

次にapp.component.tsを下記のように書き換えます。

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

export interface PeriodicElement {
  name: string;
  position: number;
  weight: number;
  symbol: string;
}

const ELEMENT_DATA: PeriodicElement[] = [
  { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },
  { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },
  { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },
  { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },
  { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },
  { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },
  { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },
  { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },
  { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },
  { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },
];

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'sample';
  displayedColumns: string[] = ['position', 'name', 'weight', 'symbol'];
  dataSource = ELEMENT_DATA;
}

HTML作成時点では発生していたビルドエラーも、上記ファイル書き換えによりゼロになるかと思います。

CSSの作成

app.component.scss(環境構築の仕方により変動あり)には下記のスタイルを追加します。

table {
    width: 100%;
}

実行結果

上記コードの実行結果は下記画像の通りとなります。

まとめ

Angular Materialとは
  • Angular同様にGoogleが開発している公式パッケージである。
  • Angularで初期作成した画面からインストール用コマンドを取得できる。
  • Angular Materialが提供するコンポーネントを利用するには、パッケージインストール後のモジュールインポートを忘れないよう注意すること。

最後になってしまいますが、Googleの「レイアウトはどうあるべきか」という考え方が集約されているだけあって、Angular Material公式を読むだけでもUIの参考になります。

他言語での開発であっても参考となるのではないでしょうか。

以上です。

スポンサーリンク