はじめに
ng-templateとngTemplateOutletを使って、テンプレートの共通処理を綺麗に書くための方法を解説します。
Angularのバージョンは18です。
ng-templateとは
ng-template は、Angularのテンプレート要素の一つで、HTMLの一部をテンプレートとして定義するために使用します。
通常のHTML要素とは異なり、ng-templateはDOMにレンダリングされません。実際のHTMLとしてレンダリングするには、コンポーネントで制御したり、ngTemplateOutletディレクティブで制御することが必要です。
<ng-template>
<!-- ここに定義された内容はそのままではレンダリングされない -->
<p>これは `ng-template` 内の内容です。</p>
</ng-template>
ngTemplateOutletとは
ngTemplateOutletディレクティブとは、ng-templateで準備したテンプレートをレンダリングするために使います。
ng-templateとngTemplateOutletで共通のテンプレート描画をする
以下のように、テンプレートに名前を付けて、ngTemplateOutletでその名前を指定することで、
ng-templateの描画を行えます。
※ngTemplateOutletのインポートをコンポーネント側に記述する必要があります。
<ng-template #errorTemplate>
<p>エラーが発生しました。</p>
</ng-template>
@if (isError) {
<p>正常に動作しています。</p>
} @else {
<ng-container [ngTemplateOutlet]="errorTemplate"></ng-container>
}
このような感じで、ng-templateで設定したテンプレートを呼び出すだけで利用できるため、
同じ描画処理を行うことがあるのであれば、これを使うと冗長性がなくなり、可読性が上がります。
パラメータを渡して異なる部分を作る
テンプレートを呼びだすときに、完全に同じ内容ではなく、少し処理を変えたいということがある場合は、パラメータを指定できます。
<ng-template #myTemplate let-name="name">
<p>こんにちは、{{ name }}さん!</p>
</ng-template>
<div *ngTemplateOutlet="myTemplate; context: { name: '太郎' }"></div>
<div *ngTemplateOutlet="myTemplate; context: { name: '花子' }"></div>
このように、let-nameとcontextを使うことで、パラメータを設定することで、ng-template側でパラメータの設定を使ってテンプレートを作ることができるので、違いを出すことができます。
まとめ
Angularのng-templateは、動的で再利用可能なテンプレート構築をサポートする強力なツールです。ng-templateを活用することで、アプリケーションの可読性が大幅に向上します。
テンプレート側で冗長的な処理を解決したい場合は、ng-templateを使って解決できないか、検討してみてください。