Ambos se utilizan en este momento (2.x, 4.x) para agrupar elementos sin tener que introducir otro elemento que se renderizará en la página (como div
o span
).
template
, sin embargo, requiere una sintaxis desagradable. Por ejemplo,
<li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>
se convertiría
<template ngFor let-item [ngForOf]="items" let-i="index" [ngForTrackBy]="trackByFn">
<li>...</li>
</template>
Puede usarlo ng-container
en su lugar, ya que sigue la agradable *
sintaxis que espera y con la que probablemente ya esté familiarizado.
<ng-container *ngFor="let item of items; let i = index; trackBy: trackByFn">
<li>...</li>
</ng-container>
Puede encontrar más detalles leyendo esta discusión en GitHub .
Tenga en cuenta que en 4.x <template>
está obsoleto y se cambió a <ng-template>
.
Utilizar
<ng-container>
si necesita un elemento auxiliar para directivas estructurales anidadas como *ngIf
o *ngFor
si desea envolver más de un elemento dentro de dicha directiva estructural;
<ng-template>
si necesita una visión "fragmento de código" que desea estampar en varios lugares utilizando ngForTemplate
, ngTemplateOutlet
o createEmbeddedView()
.
@Input()
s.*
es más conveniente por supuesto. Pero tienes razón,<ng-container>
se introdujo porque las diferencias de sintaxis causaron bastante confusión.ng-template
se utiliza para la directiva estructural comong-if
,ng-for
yng-switch
. Si lo usa sin la directiva estructural, no pasa nada y se procesará.ng-container
se usa cuando no tiene una envoltura adecuada o un contenedor principal. En la mayoría de los casos, usamosdiv
ospan
como contenedor, pero en tales casos queremos usar múltiples directivas estructurales. Pero no podemos usar más de una directiva estructural en un elemento, en ese caso,ng-container
se puede usar como contenedorfuente
ng-template
El
<ng-template>
es un elemento angular para renderizar HTML. Nunca se muestra directamente. Úselo para directivas estructurales como: ngIf, ngFor, ngSwitch, ..Ejemplo :
Angular traduce el atributo * ngIf en un
<ng-template>
elemento, envuelto alrededor del elemento host, como este.<ng-template [ngIf]="hero"> <div class="name">{{hero.name}}</div> </ng-template>
ng-container Se
utiliza como elemento de agrupación cuando no hay un elemento anfitrión adecuado.
Ejemplo:
<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>
Esto no funcionará. Porque algunos elementos HTML requieren que todos los hijos inmediatos sean de un tipo específico. Por ejemplo, el
<select>
elemento requiere hijos. No puede envolver las opciones en condicional o<span>
.Prueba esto :
<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>
Esto funcionará.
Más información: Directiva estructural angular
fuente
ng-template muestra el valor verdadero.
ng-container show sin condición también muestra contenido.
fuente
ng-template
como su nombre lo indica, denota una plantilla . Por sí mismo no rinde nada. Podemos usar ang-container
para proporcionar un marcador de posición para representar una plantilla de forma dinámica .Otro caso de uso
ng-template
es que podemos usarlo para anidar varias directivas estructurales juntas. Puede encontrar excelentes ejemplos aquí en esta publicación de blog: angular ng-template / ng-containerfuente
En términos simples,
ng-container
es como un componente superior de React , que solo ayuda en la representación de sus elementos secundarios.ng-template
es básicamente para la implementación interna de Angular , donde cualquier cosa dentro deng-template
se ignora por completo mientras se renderiza y básicamente se convierte en un comentario en la fuente de la vista. Se supone que esto se usa con las directivas internas de Angular comongIf
,ngSwitch
etc.fuente
Me gusta
<ng-container>
como una forma de separar "lógica" de "marcado" tanto como sea posible en los archivos Angular .component.html.Ejemplo (parcial) para representar filas de una tabla html:
De esa manera, si quiero cambiar de un HTML
<table>
a otra cosa, como un montón<div>
con estilo flexbox, no necesito "forjar" la lógica del bucle (o arriesgarme a perderla por completo) desde dentro del<tr>
. También evita que la lógica de bucle (ngFor) se oscurezca parcialmente por el html normal.fuente