Les deux sont pour le moment (2.x, 4.x) utilisés pour regrouper des éléments sans avoir à introduire un autre élément qui sera rendu sur la page (tel que div
ou span
).
template
, cependant, nécessite une syntaxe désagréable. Par exemple,
<li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>
deviendrait
<template ngFor let-item [ngForOf]="items" let-i="index" [ngForTrackBy]="trackByFn">
<li>...</li>
</template>
Vous pouvez l'utiliser à la ng-container
place car il suit la belle *
syntaxe que vous attendez et que vous connaissez probablement déjà.
<ng-container *ngFor="let item of items; let i = index; trackBy: trackByFn">
<li>...</li>
</ng-container>
Vous pouvez trouver plus de détails en lisant cette discussion sur GitHub .
Notez que dans 4.x <template>
est obsolète et est remplacé par <ng-template>
.
Utilisation
<ng-container>
si vous avez besoin d'un élément d'aide pour les directives structurelles imbriquées comme *ngIf
ou *ngFor
ou si vous voulez envelopper plus d'un élément dans une telle directive structurelle;
<ng-template>
si vous avez besoin d' une vue « snippet » que vous souhaitez tamponner à différents endroits en utilisant ngForTemplate
, ngTemplateOutlet
ou createEmbeddedView()
.
@Input()
s.*
est bien sûr plus pratique. Mais vous avez raison, a<ng-container>
été introduit parce que les différences de syntaxe ont causé une certaine confusion.ng-template
est utilisé pour la directive structurelle commeng-if
,ng-for
etng-switch
. Si vous l'utilisez sans la directive structurelle, rien ne se passe et il sera rendu.ng-container
est utilisé lorsque vous n'avez pas de wrapper ou de conteneur parent approprié. Dans la plupart des cas, nous utilisonsdiv
ou enspan
tant que conteneur, mais dans de tels cas, nous voulons utiliser plusieurs directives structurelles. Mais nous ne pouvons pas utiliser plus d'une directive structurelle sur un élément, dans ce cas,ng-container
peut être utilisé comme conteneurla source
ng-template
Le
<ng-template>
est un élément angulaire pour le rendu HTML. Il n'est jamais affiché directement. À utiliser pour les directives structurelles telles que: ngIf, ngFor, ngSwitch, ..Exemple :
Angular traduit l'attribut * ngIf en un
<ng-template>
élément, enroulé autour de l'élément hôte, comme ceci.ng-container À
utiliser comme élément de regroupement lorsqu'il n'y a pas d'élément hôte approprié.
Exemple:
Cela ne fonctionnera pas. Parce que certains éléments HTML exigent que tous les enfants immédiats soient d'un type spécifique. Par exemple, l'
<select>
élément nécessite des enfants. Vous ne pouvez pas envelopper les options dans un conditionnel ou un fichier<span>
.Essaye ça :
Cela fonctionnera.
Plus d'informations: Directive sur les structures angulaires
la source
ng-template affiche la vraie valeur.
ng-container show sans condition affiche également le contenu.
la source
ng-template
comme son nom l'indique, désigne un modèle . En soi, il ne rend rien. Nous pouvons utiliser ang-container
pour fournir un espace réservé pour rendre un modèle dynamiquement .Un autre cas d'utilisation
ng-template
est que nous pouvons l'utiliser pour imbriquer plusieurs directives structurelles ensemble. Vous pouvez trouver d'excellents exemples ici dans ce billet de blog: angular ng-template / ng-containerla source
En termes simples,
ng-container
c'est comme un composant supérieur de React , qui aide uniquement au rendu de ses éléments enfants.ng-template
est essentiellement pour l'implémentation interne d' Angular , où tout ce qui se trouve à l'intérieur deng-template
est complètement ignoré lors du rendu et devient fondamentalement un commentaire sur la source de la vue. Ceci est censé être utilisé avec les directives internes d'Angular commengIf
,ngSwitch
etc.la source
J'aime
<ng-container>
autant que possible séparer la "logique" du "balisage" dans les fichiers angulaires .component.html.(partiel) exemple pour rendre les lignes d'une table html:
De cette façon, si je veux passer d'un HTML
<table>
à quelque chose d'autre, comme un tas de<div>
style flexbox, je n'ai pas besoin de "découper" la logique de boucle (ou de risquer de la perdre complètement) de l'intérieur du<tr>
. Il empêche également la logique de bouclage (ngFor) d'être partiellement obscurcie par le html normal.la source