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 divo 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-containeren 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 *ngIfo *ngForsi 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, ngTemplateOutleto 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-templatese utiliza para la directiva estructural comong-if,ng-foryng-switch. Si lo usa sin la directiva estructural, no pasa nada y se procesará.ng-containerse usa cuando no tiene una envoltura adecuada o un contenedor principal. En la mayoría de los casos, usamosdivospancomo 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-containerse 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-templatecomo su nombre lo indica, denota una plantilla . Por sí mismo no rinde nada. Podemos usar ang-containerpara proporcionar un marcador de posición para representar una plantilla de forma dinámica .Otro caso de uso
ng-templatees 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-containeres como un componente superior de React , que solo ayuda en la representación de sus elementos secundarios.ng-templatees básicamente para la implementación interna de Angular , donde cualquier cosa dentro deng-templatese 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,ngSwitchetc.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