本記事では、Ignite UI for Angular の IgxGridComponent でデータ取得中に画面をブロックするモーダルのローディングインジケーターを表示する方法を説明します。中心となる API は IgxOverlayService です。

IgxGridComponent の設定

グリッドとともに、データ取得を開始するボタンを配置します。ボタンは loading シグナルの値に応じて活性・非活性を切り替えます。

<div class="gridContainer">
    <igx-grid #grid1 [data]="data()" [autoGenerate]="false" height="500px" width="800px">
        <igx-column ...></igx-column>
        ...
    </igx-grid>
    <button igxButton="contained" igxRipple="white" [disabled]="loading()" (click)="getData()">Get Data</button>
</div>

コンポーネント側では、オーバーレイを表示するために IgxOverlayServiceViewContainerRef を注入しておきます。

import { ViewContainerRef, inject, signal } from '@angular/core';
import { AbsoluteScrollStrategy, IgxOverlayService, OverlaySettings } from '@infragistics/igniteui-angular/core';
import { LoadingSpinnerComponent } from './loading-spinner.component';

export class App {
  private readonly overlayService = inject(IgxOverlayService);
  private readonly viewContainerRef = inject(ViewContainerRef);

  private overlayId?: string;

  public readonly loading = signal(false);
}

IgxOverlayService の使用

データ取得を開始するタイミングで IgxOverlayService.attach() によりオーバーレイ要素を生成し、show() で表示します。OverlaySettingsmodaltruecloseOnOutsideClickfalse に設定することで、モーダル表示となり、データ取得が完了するまでグリッドへの操作をブロックします。取得が完了したら hide()detach() でオーバーレイを非表示にして破棄します。なお、オーバーレイの表示内容には IgxCircularProgressBarComponent をラップした LoadingSpinnerComponent を指定しています。

public getData(): void {
  if (this.loading()) {
    return;
  }

  this.loading.set(true);
  this.showOverlay();

  this.loadTimeoutId = setTimeout(() => {
    this.data.set(DATA);

    this.hideOverlay();
    this.loading.set(false);
  }, 5000);
}

private showOverlay(): void {
  const overlaySettings: OverlaySettings = {
    scrollStrategy: new AbsoluteScrollStrategy(),
    modal: true,
    closeOnOutsideClick: false
  };

  this.overlayId = this.overlayService.attach(LoadingSpinnerComponent, this.viewContainerRef, overlaySettings);
  this.overlayService.show(this.overlayId);
}

private hideOverlay(): void {
  if (this.overlayId) {
    this.overlayService.hide(this.overlayId);
    this.overlayService.detach(this.overlayId);
    this.overlayId = undefined;
  }
}

実行結果

「Get Data」ボタンをクリックすると、グリッド上にモーダルのローディングインジケーターが表示され、データ取得(本サンプルでは setTimeout による疑似的な非同期処理)が完了するまでグリッドへの操作がブロックされます。約 5 秒後にデータが表示されると同時に、オーバーレイが自動的に非表示になります。

製品について

Ignite UI for Angular