<ng-container>
al rescate
El Angular <ng-container>
es un elemento de agrupación que no interfiere con los estilos o el diseño porque Angular no lo coloca en el DOM.
(...)
El <ng-container>
es un elemento de sintaxis reconocido por el analizador angular. No es una directiva, componente, clase o interfaz. Es más como las llaves en un if-block de JavaScript:
if (someCondition) {
statement1;
statement2;
statement3;
}
Sin esas llaves, JavaScript solo ejecutaría la primera instrucción cuando intente ejecutarlas condicionalmente como un solo bloque. Los <ng-container>
satisface una necesidad similar en las plantillas angular.
Respuesta original:
De acuerdo con esta solicitud de extracción :
<ng-container>
es un contenedor lógico que se puede usar para agrupar nodos pero no se representa en el árbol DOM como un nodo.
<ng-container>
se representa como un comentario HTML.
entonces esta plantilla angular:
<div>
<ng-container>foo</ng-container>
<div>
producirá este tipo de salida:
<div>
<!--template bindings={}-->foo
<div>
Por ng-container
lo tanto, es útil cuando desea agregar condicionalmente un grupo de elementos (es decir, usar *ngIf="foo"
) en su aplicación, pero no desea envolverlos con otro elemento .
<div>
<ng-container *ngIf="true">
<h2>Title</h2>
<div>Content</div>
</ng-container>
</div>
entonces producirá:
<div>
<h2>Title</h2>
<div>Content</div>
</div>
<template>
cuando se usa sin directivas.<template>
solo produciría<!--template bindings={}-->
en este caso.<template></template>
producirá<script></script>
ver esto<script>
durante la compilación, se elimina después, no hay etiquetas adicionales en DOM. Creo que el manual contiene información obsoleta o simplemente está mal en eso. De cualquier manera, gracias por señalar la diferencia principal entre <ng-container> y <template>.<script></script>
. Ha estado haciendo algo así<!--template bindings={}-->
por bastante tiempo. Los documentos se corregirán pronto.La documentación ( https://angular.io/guide/template-syntax#!#star-template ) da el siguiente ejemplo. Digamos que tenemos un código de plantilla como este:
Antes de ser renderizado, será "des-azucarado". Es decir, la notación asterix se transcribirá a la notación:
Si 'currentHero' es verdadero, esto se representará como
Pero, ¿qué pasa si quieres una salida condicional como esta?
.. y no desea que la salida se envuelva en un contenedor.
Puede escribir la versión sin azucar directamente así:
Y esto funcionará bien. Sin embargo, ahora necesitamos ngIf para tener corchetes [] en lugar de un asterisco *, y esto es confuso ( https://github.com/angular/angular.io/issues/2303 )
Por esa razón se creó una notación diferente, así:
Ambas versiones producirán los mismos resultados (solo se mostrarán las etiquetas h1 y p). Se prefiere el segundo porque puede usar * ngIf como siempre.
fuente
ng-container
surgió la idea directiva , gracias :)Los casos de uso de Imo
ng-container
son reemplazos simples para los cuales una plantilla / componente personalizado sería excesivo. En el documento de API mencionan lo siguientey supongo que de eso se trata: agrupar cosas.
Tenga en cuenta que la
ng-container
directiva cae en lugar de una plantilla donde su directiva envuelve el contenido real.fuente
Un caso de uso cuando desee usar una tabla con * ngIf y * ngFor - Como poner un div en td / th hará que el elemento de la tabla se comporte mal -. Me enfrenté a este problema y esa fue la respuesta.
fuente
<template [ngIf]...>
. La pregunta era la diferencia entre estos dos enfoques.