誰かが使用の違いを説明できますか <ng-container>
とし<ng-template>
要素の?
のドキュメントが見つかりませんでした NgContainer
ず、テンプレートタグの違いがよくわかりません。
それぞれのコード例が大いに役立ちます。
回答:
どちらも現時点では(2.x、4.x)、ページにレンダリングされる別の要素(div
またはなどspan
)を導入する必要なく、要素をグループ化するために使用されます。
template
ただし、厄介な構文が必要です。例えば、
<li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>
なるだろう
<template ngFor let-item [ngForOf]="items" let-i="index" [ngForTrackBy]="trackByFn">
<li>...</li>
</template>
それはあなたが期待し、おそらくすでに慣れてng-container
いる素晴らしい*
構文に従っているので代わりに使うことができます。
<ng-container *ngFor="let item of items; let i = index; trackBy: trackByFn">
<li>...</li>
</ng-container>
詳細については、GitHubのこのディスカッションをご覧ください。
4.xでは<template>
非推奨であり、に変更されてい<ng-template>
ます。
使用する
<ng-container>
のようなネストされた構造ディレクティブのヘルパー要素が必要な*ngIf
場合、*ngFor
またはそのような構造ディレクティブ内に複数の要素をラップする場合。<ng-template>
ビューが必要な場合は、使用して、さまざまな場所でスタンプしたいことを「スニペット」ngForTemplate
、ngTemplateOutlet
またはcreateEmbeddedView()
。テンプレートがNG HTMLをレンダリングするための角度の要素です。直接表示されることはありません。ngIf、ngFor、ngSwitchなどの構造ディレクティブに使用します。例:<ng-template>
<div *ngIf="hero" class="name">{{hero.name}}</div>
Angularは* ngIf属性を<ng-template>
要素に変換し、このようにホスト要素をラップします。
<ng-template [ngIf]="hero">
<div class="name">{{hero.name}}</div>
</ng-template>
ng-container
適切なホスト要素がない場合、グループ化要素として使用します。
例:
<div>
Pick your favorite hero
(<label><input type="checkbox" checked (change)="showSad = !showSad">show sad</label>)
</div>
<select [(ngModel)]="hero">
<span *ngFor="let h of heroes">
<span *ngIf="showSad || h.emotion !== 'sad'">
<option [ngValue]="h">{{h.name}} ({{h.emotion}})</option>
</span>
</span>
</select>
これは機能しません。一部のHTML要素では、すべての直接の子が特定のタイプである必要があるためです。たとえば、<select>
要素には子が必要です。オプションを条件付きまたはでラップすることはできません<span>
。
これを試して :
<div>
Pick your favorite hero
(<label><input type="checkbox" checked (change)="showSad = !showSad">show sad</label>)
</div>
<select [(ngModel)]="hero">
<ng-container *ngFor="let h of heroes">
<ng-container *ngIf="showSad || h.emotion !== 'sad'">
<option [ngValue]="h">{{h.name}} ({{h.emotion}})</option>
</ng-container>
</ng-container>
</select>
これは動作します。
ng-template
名前が示すように、はテンプレートを示します。それ自体は何もレンダリングしません。a ng-container
を使用して、テンプレートを動的にレンダリングするためのプレースホルダーを提供できます。
のもう1つの使用例ng-template
は、複数の構造ディレクティブを一緒にネストするために使用できることです。あなたはこのブログ投稿でここに素晴らしい例を見つけることができます:angular ng-template / ng-container
私のような<ng-container>
角度.component.htmlファイルに可能な限り「マークアップ」から「ロジック」を分離するための方法として。
(部分)HTMLテーブルの行をレンダリングする例:
<ng-container *ngFor="let product of products">
<tr>
<td></td>
<td>{{ product.productName }}</td>
<td>{{ product.productCode }}</td>
<td>{{ product.releaseDate }}</td>
<td>{{ product.price }}</td>
<td>{{ product.starRating }}</td>
</tr>
</ng-container>
そうすることで、HTML <table>
から他の何かに変更したい場合(たとえば<div>
、フレックスボックスのスタイリングの束など)、ループロジックを「切り出す」必要がありません(または完全に失われるリスクがあり<tr>
ます)。また、ループ(ngFor)ロジックが通常のhtmlによって部分的に隠されないようにします。
@Input()
sに渡すための通常の構文です。*
もちろん便利です。しかし、あなたが正しい、<ng-container>
それは構文の違いがかなりの混乱を引き起こしたために導入されました。