この記事ではAngularの『ngIfディレクティブ』について、
- ngIfディレクティブとは
- 「*ngIf」で表示非表示を切り替える方法
- 「*ngIf~else」で表示非表示を切り替える方法
- 「*ngIf~then~else」で表示非表示を切り替える方法
などを図を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。
ngIfディレクティブとは
ngIfディレクティブは、JavaScriptのif命令に相当するディレクティブです。ngIfディレクティブを用いることで条件分岐をすることができます。
ngIfディレクティブを用いた条件分岐の方法には、以下の3種類あります。
ngIfディレクティブの条件分岐
- 「*ngIf」のみを用いる方法
- 「*ngIf~else」を用いる方法
- 「*ngIf~then~else」を用いる方法
この中で一番よく使うのは、「*ngIf」のみを用いる方法です。この方法では、条件式の結果がtrue
の時のみ、配下のコンテンツを表示します。
では、実際に具体的なプログラム例を見てみましょう。
「*ngIf」で表示非表示を切り替える方法
*ngIf
の構文を以下に示します。
「*ngIf」の構文
<任意の要素 *ngIf="条件式">条件式がtrueの場合に表示されるコンテンツ</任意の要素>
*ngIf
を用いたプログラム例を以下に示します。
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">表示/非表示</button>
<h1 *ngIf="showMessage">Hello Angular!</h1>
`,
})
export class AppComponent {
showMessage = true;
onClick() {
this.showMessage = !this.showMessage;
}
}
ngIfディレクティブには、true/false値として評価できる式を渡します。上記のプログラムでは、AppComponent
のshowMessage
プロパティを渡しています。
showMessage
プロパティがtrue
の場合にコンテンツ(上記の場合だと、Hello Angular!
)が表示されるようになります。false
の場合にはコンテンツが表示されません。
showMessage
プロパティはボタンをクリックした時に実行されるonClick
メソッドにより、true/falseが切り替わります。
なお、showMessage
プロパティがtrue
の時とfalse
の時におけるDOMをデベロッパーツールで確認すると以下のようになっています。
ngIfディレクティブは条件がfalse
の時、CSSスタイルによる操作で非表示にしているのではなく、DOM要素そのものを破棄しています。
補足
DOM要素そのものを破棄することによって、その要素のレンダリングやデータバインディングのリソースを節約し、パフォーマンスを向上させることができます。一般的に、ページ上の要素は表示/非表示に関わらず、リソースを消費しています。例えば、AngularではDOM要素が非表示の場合でも、データバインディングによる変更監視などを行っています。ngIfディレクティブによりDOM要素そのものを破棄することで、無駄なリソースの消費を削減しています。
ただし、この方法は常に最適とは限りません。要素によっては、初期化に高いオーバーヘッドを要するかもしれませんし、ngIfディレクティブを使ってDOM要素を頻繁に作成・破棄することで、毎回初期化処理が発生します。そのため、使用状況によっては、CSSスタイル(例えばdisplay: none;
)を用いて要素を非表示にするなど、他の手法を検討してください。
【補足】CSSスタイルを用いて要素を非表示にする方法
CSSスタイルを用いて要素を非表示するプログラム例を以下に示しています。
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">表示/非表示</button>
<h1 [ngStyle]="{ display: showMessage ? 'block' : 'none' }">
Hello Angular!
</h1>
`,
})
export class AppComponent {
showMessage = true;
onClick() {
this.showMessage = !this.showMessage;
}
}
デベロッパーツールを確認すると、以下に示すようにngIfディレクティブの条件がfalse
の時にも、h1
要素が残っていることが分かります。
「*ngIf~else」で表示非表示を切り替える方法
*ngIf~else
の構文を以下に示します。
「*ngIf~else」の構文
<任意の要素 *ngIf="条件式; else false用のテンプレート名">条件式がtrueの場合に表示されるコンテンツ</任意の要素>
<ng-template #false用のテンプレート名>
条件式がfalseの場合に表示されるコンテンツ
</ng-template>
*ngIf~else
を用いることで、条件式がfalse
の時でもコンテンツを表示することができます。上記の構文では、ngIfディレクティブは条件がtrue
の時には、その配下のコンテンツを表示し、false
の時には、「false用のテンプレート名」の配下のコンテンツを表示します。なお、テンプレートはng-templete
要素で宣言をします。
*ngIf~else
を用いたプログラム例を以下に示します。
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">表示/非表示</button>
<h1 *ngIf="showMessage; else falseContent">ngIfの条件式がtrueです</h1>
<ng-template #falseContent>
<h1>ngIfの条件式がfalseです</h1>
</ng-template>
`,
})
export class AppComponent {
showMessage = true;
onClick() {
this.showMessage = !this.showMessage;
}
}
上記のプログラムでは、条件式がfalse
の時に、falseContent
という名前のテンプレート配下のコンテンツを表示しています。
補足
*ngIf~else
はAngular4以降で使用できるようになりました。- Angular4より前のバージョンでは、else句は使用できません。ngIfディレクティブを複数使用するか、ngSwitchディレクティブを使用することで、複数に分岐することができるようになります。
「*ngIf~then~else」で表示非表示を切り替える方法
*ngIf~then~else
の構文を以下に示します。
「*ngIf~then~else」の構文
<任意の要素 *ngIf="条件式; then true用のテンプレート名; else false用のテンプレート名">この部分は無視され、何も表示されない</任意の要素>
<ng-template #true用のテンプレート名>
条件式がtrueの場合に表示されるコンテンツ
</ng-template>
<ng-template #false用のテンプレート名>
条件式がfalseの場合に表示されるコンテンツ
</ng-template>
上記の構文では、ngIfディレクティブは条件がtrue
の時には、「true用のテンプレート名」の配下のコンテンツを表示し、false
の時には、「false用のテンプレート名」の配下のコンテンツを表示します。
*ngIf~then~else
を用いたプログラム例を以下に示します。
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">表示/非表示</button>
<h1 *ngIf="showMessage; then trueContent; else falseContent">
この部分は無視され、何も表示されない
</h1>
<ng-template #trueContent>
<h1>ngIfの条件式がtrueです</h1>
</ng-template>
<ng-template #falseContent>
<h1>ngIfの条件式がfalseです</h1>
</ng-template>
`,
})
export class AppComponent {
showMessage = true;
onClick() {
this.showMessage = !this.showMessage;
}
}
条件式がtrue
の時に、trueContent
という名前のテンプレート配下のコンテンツが表示され、false
の時に、falseContent
という名前のテンプレート配下のコンテンツを表示されます。
then
句を用いた場合、ngIfディレクティブ配下のコンテンツは条件式の値に関わらず、無視される点に注意してください。
本記事のまとめ
この記事ではAngularの『ngIfディレクティブ』について、以下の内容を説明しました。
- ngIfディレクティブとは
- 「*ngIf」で表示非表示を切り替える方法
- 「*ngIf~else」で表示非表示を切り替える方法
- 「*ngIf~then~else」で表示非表示を切り替える方法
お読み頂きありがとうございました。