Angularでのカスタムディレクティブ&パイプの活用

Angularでは、独自のディレクティブパイプを作成することで、UIの表現力やロジックの再利用性を高めることができます。
本章では、複雑なデータ変換を行うカスタムパイプ、DOM操作や表示制御を行うカスタムディレクティブ、そして再利用性の高いユーティリティ構築の手法を紹介します。

1. カスタムパイプ作成(複雑な表示変換)

パイプ(pipe)は、テンプレート内で値を変換・整形するために使用します。
Angularでは、標準のdateuppercaseに加えて、独自パイプを作成して複雑な変換ロジックを抽象化できます。

■ パイプの作成例(カンマ区切り+単位付き)

ng generate pipe numberWithUnit

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'numberWithUnit' })
export class NumberWithUnitPipe implements PipeTransform {
  transform(value: number, unit: string = '円'): string {
    if (isNaN(value)) return '';
    return value.toLocaleString() + unit;
  }
}

テンプレート使用例:
{{ 1500000 | numberWithUnit:'円' }}
1,500,000円

これにより、金額・距離・重さなどさまざまな単位表記のフォーマット処理を一元化できます。

2. カスタムディレクティブでDOM制御

ディレクティブは、HTML要素に特定の動作やスタイル変更を付与するための機能です。
カスタムディレクティブを使えば、要素の強調表示やクリックイベント処理、条件付きのDOM操作などを簡潔に再利用できます。

■ ハイライトディレクティブの例

ng generate directive highlight

import { Directive, ElementRef, HostListener, Renderer2 } from '@angular/core';

@Directive({ selector: '[appHighlight]' })
export class HighlightDirective {
  constructor(private el: ElementRef, private renderer: Renderer2) {}

  @HostListener('mouseenter') onMouseEnter() {
    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');
  }

  @HostListener('mouseleave') onMouseLeave() {
    this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');
  }
}

テンプレート使用例:
<div appHighlight>ホバーすると背景が黄色に!</div>

■ 条件付きスタイル適用や動的制御も可能

ディレクティブに引数を渡して、動的に動作を変えることもできます。
表示・非表示、無効化、スタイル適用など、頻出処理の共通化に有効です。

3. 再利用性の高いユーティリティ構築

カスタムパイプやディレクティブは、SharedModuleなどにまとめておくことで、どのコンポーネントからでも簡単に利用できます。

■ SharedModuleで共通化

@NgModule({
  declarations: [NumberWithUnitPipe, HighlightDirective],
  exports: [NumberWithUnitPipe, HighlightDirective]
})
export class SharedModule {}

再利用パターンの一例:

  • 通貨・距離・日付などの形式変換 → カスタムパイプ
  • 共通UIエフェクトやバリデーション → ディレクティブ
  • 動的クラスやスタイルの切り替え → ディレクティブ

まとめ

Angularにおけるカスタムパイプとディレクティブは、UIの品質と再利用性を高める重要なツールです。処理ロジックをテンプレートから分離し、見通しの良いコンポーネント設計を実現できます。
実務では、これらをうまく活用して、「どの画面でも使える共通部品」として仕組み化するのが理想です。

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com