【保存版】Angular Materialで空データ時の「データが見つかりませんでした」メッセージの表示方法3選

2024-05-20

Angular Material データテーブルでデータがない場合に空メッセージを表示する方法

*ngIf ディレクティブは、条件に応じて要素を表示したり非表示にしたりするのに使用できます。この場合、dataSource.data プロパティが空かどうかをチェックして、空メッセージを表示できます。

<mat-table [dataSource]="dataSource">
  ...

  <ng-container matColumnDef="empty">
    <mat-header-cell *matHeaderCellDef> データ </mat-header-cell>
    <mat-cell *matCellDef="let row">
      <ng-container *ngIf="!dataSource.data.length">
        <span>データが見つかりませんでした。</span>
      </ng-container>
    </mat-cell>
  </ng-container>

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

ngNoData ディレクティブを使用する

Angular Material には、ngNoData ディレクティブが用意されています。このディレクティブは、データソースにデータがない場合にのみ表示される要素を定義するために使用できます。

<mat-table [dataSource]="dataSource">
  ...

  <ng-container matColumnDef="empty">
    <mat-header-cell *matHeaderCellDef> データ </mat-header-cell>
    <mat-cell *matCellDef="let row">
      <ng-template matCellDef="empty" ngNoData>
        <span>データが見つかりませんでした。</span>
      </ng-template>
    </mat-cell>
  </ng-container>

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

カスタムコンポーネントを使用する

より複雑な空メッセージを表示したい場合は、カスタムコンポーネントを作成できます。このコンポーネントは、データソースの状態に基づいて動的にコンテンツを更新できます。

<mat-table [dataSource]="dataSource">
  ...

  <ng-container matColumnDef="empty">
    <mat-header-cell *matHeaderCellDef> データ </mat-header-cell>
    <mat-cell *matCellDef="let row">
      <app-no-data [dataSource]="dataSource"></app-no-data>
    </mat-cell>
  </ng-container>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
  <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
</mat-table>
@Component({
  selector: 'app-no-data',
  templateUrl: './no-data.component.html',
  styleUrls: ['./no-data.component.css']
})
export class NoDataComponent {
  @Input() dataSource: MatTableDataSource<any>;

  constructor() { }

  get isEmpty(): boolean {
    return this.dataSource.data.length === 0;
  }
}
<div *ngIf="isEmpty">
  <span>データが見つかりませんでした。</span>
  <button (click)="onSearch()"> 検索 </button>
</div>

これらの方法のいずれかを使用して、Angular Material データテーブルでデータがない場合に空メッセージを表示できます。どの方法を使用するかは、要件や好みの問題です。

補足

  • 空メッセージのスタイルをカスタマイズするには、mat-table および mat-cell クラスに CSS ルールを追加できます。
  • データが見つかった場合にメッセージを表示することもできます。これを行うには、dataSource.data.length > 0 条件を使用します。
  • データソースが更新されたときに空メッセージを自動的に更新するには、dataSource.connect() メソッドを使用できます。



<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Angular Material データテーブル</title>
  <link href="https://unpkg.com/@angular/material/prebuilt-themes/indigo-pink.css" rel="stylesheet">
</head>
<body>
  <app-root></app-root>

  <script src="runtime.js" type="module"></script>
  <script src="polyfills.js" type="module"></script>
  <script src="main.js" type="module"></script>
</body>
</html>
// app.component.ts
import { Component } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  dataSource = new MatTableDataSource<any>([]);
  displayedColumns = ['name', 'age', 'city'];

  constructor() {
    this.dataSource.data = [
      { name: 'John Doe', age: 30, city: 'New York' },
      { name: 'Jane Doe', age: 25, city: 'Los Angeles' },
      { name: 'Peter Jones', age: 40, city: 'Chicago' }
    ];
  }
}
<mat-table [dataSource]="dataSource">
  <ng-container matColumnDef="name">
    <mat-header-cell *matHeaderCellDef> 名前 </mat-header-cell>
    <mat-cell *matCellDef="let row"> {{row.name}} </mat-cell>
  </ng-container>

  <ng-container matColumnDef="age">
    <mat-header-cell *matHeaderCellDef> 年齢 </mat-header-cell>
    <mat-cell *matCellDef="let row"> {{row.age}} </mat-cell>
  </ng-container>

  <ng-container matColumnDef="city">
    <mat-header-cell *matHeaderCellDef> 都市 </mat-header-cell>
    <mat-cell *matCellDef="let row"> {{row.city}} </mat-cell>
  </ng-container>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
  <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
</mat-table>
/* app.component.css */
mat-table {
  width: 100%;
}

このコードを実行すると、以下の表が表示されます。

名前年齢都市
John Doe30New York
Jane Doe25Los Angeles
Peter Jones40Chicago

データソースが空の場合、以下の空メッセージが表示されます。

  • データが見つかりませんでした。

このコードは、*ngIf ディレクティブを使用して空メッセージを表示する方法を示しています。他の方法で空メッセージを表示することもできます。詳細については、上記のドキュメントを参照してください。




Angular Material データテーブルでデータがない場合に空メッセージを表示するその他の方法

ngTemplate ディレクティブを使用して、データソースの状態に基づいて動的にコンテンツを生成できます。この方法は、より複雑な空メッセージを表示する場合に役立ちます。

<mat-table [dataSource]="dataSource">
  ...

  <ng-container matColumnDef="empty">
    <mat-header-cell *matHeaderCellDef> データ </mat-header-cell>
    <mat-cell *matCellDef="let row">
      <ng-template matCellDef="empty">
        <span *ngIf="!dataSource.data.length">
          データが見つかりませんでした。
          <button (click)="onSearch()"> 検索 </button>
        </span>
      </ng-template>
    </mat-cell>
  </ng-container>

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

プレースホルダー列を使用する

データソースが空の場合にのみ表示されるプレースホルダー列を追加できます。この方法は、シンプルな空メッセージを表示する場合に役立ちます。

<mat-table [dataSource]="dataSource">
  ...

  <ng-container matColumnDef="empty">
    <mat-header-cell *matHeaderCellDef> データ </mat-header-cell>
    <mat-cell *matCellDef="let row">
      <span *ngIf="!dataSource.data.length"> データが見つかりませんでした。 </span>
    </mat-cell>
  </ng-container>

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

ProgressBar を使用する

データがロードされている間、ProgressBar を表示してユーザーにフィードバックを提供できます。データソースが空の場合、ProgressBar を非表示にして空メッセージを表示できます。

<mat-table [dataSource]="dataSource">
  ...

  <mat-progress-bar *ngIf="dataSource.loading"></mat-progress-bar>

  <ng-container matColumnDef="empty">
    <mat-header-cell *matHeaderCellDef> データ </mat-header-cell>
    <mat-cell *matCellDef="let row">
      <span *ngIf="dataSource.loading"> データをロードしています... </span>
      <span *ngIf="!dataSource.loading && !dataSource.data.length"> データが見つかりませんでした。 </span>
    </mat-cell>
  </ng-container>

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

これらの方法はほんの一例です。要件や好みの問題に応じて、最適な方法を選択できます。


angular


【最新版】Angular 2 ボタン無効化のベストプラクティス:パフォーマンスとアクセシビリティを向上させる

disabled 属性を使う最も基本的な方法は、disabled 属性をボタン要素に直接追加することです。この方法では、常にボタンを無効化することができます。フォームコントロールの状態にバインドするフォームを使用している場合は、フォームコントロールの状態にバインドして、動的にボタンを無効化することができます。...


Angular:コンポーネントとディレクティブの機能を拡張する@HostBindingと@HostListener

Angularでは、コンポーネントやディレクティブの機能を拡張するために、様々なデコレータが用意されています。その中でも、@HostBindingと@HostListenerは、ホスト要素との連携において非常に重要な役割を果たします。@HostBinding:ホスト要素のプロパティを操作...


Angular で発生する XSS 脆弱性と DomSanitizer を用いた対策

問題点Base64 エンコードされた画像を直接 img タグの src 属性に設定すると、XSS 攻撃などのセキュリティ上の脆弱性を引き起こす可能性があります。これは、悪意のあるユーザーが、img タグに不正な URL を挿入し、アプリケーションを乗っ取ってしまう可能性があるためです。...


Angularルーティングの達人になる:ActivatedRouteとActivatedRouteSnapshotを使いこなすテクニック

ActivatedRouteアクティブなルートに関する情報を提供する オブザーバブル です。現在のルートパラメータ、クエリパラメータ、データ、URL へのアクセスを提供します。購読することで、ルート情報の変更を検知できます。コンポーネントのコンストラクタで注入されます。...


【徹底解説】Angular 5で発生する「No provider for ControlContainer」エラーの原因と解決策

Angular 5 で "No provider for ControlContainer" エラーが発生した場合、テンプレート内でコンポーネントを使用しようとしているのに、そのコンポーネントに必要なコンテナが提供されていないことを意味します。このエラーは、コンポーネントの依存関係が正しく設定されていないことが原因で発生します。...