官方文档中提到了ng-container
,但我仍在努力理解它是如何工作的以及哪些是用例。
在ngPlural
和ngSwitch
指令中特别提到了它。<ng-container>
和<template>
的作用是一样的,还是取决于是否编写了使用其中一个的指令?
是
<ng-container *ngPluralCase="'=0'">there is nothing</ng-container>
以及
<template [ngPluralCase]="'=0'">there is nothing</template>
应该是一样的吗
我们该如何从中选择一个呢?
如何在自定义指令中使用<ng-container>
?
6条答案
按热度按时间u5rb5r591#
编辑:现已记录
来拯救我们
Angular
<ng-container>
是一个分组元素,它不会干扰样式或布局,因为Angular不会将它放在DOM中。(...)
<ng-container>
是Angular解析器可以识别的语法元素,它不是指令、组件、类或接口,更像是JavaScript if块中的花括号:如果没有这些花括号,JavaScript将只执行第一条语句,当你打算有条件地把它们作为一个单独的块执行时,
<ng-container>
满足了Angular模板中类似的需求。原始答案:
根据this pull request:
<ng-container>
是一个逻辑容器,可用于对节点进行分组,但不会在DOM树中呈现为节点。<ng-container>
呈现为HTML注解。这个Angular 模板
会产生这样的输出:
因此,当你想在应用程序中有条件地附加一组元素(即使用
*ngIf="foo"
),但**不想用另一个元素 Package 它们时,ng-container
是有用的。将产生:
nkcskrwz2#
文档(https://angular.io/guide/template-syntax#!#star-template)给出了下面的例子,假设我们有这样的模板代码:
在将其呈现之前,将其“去糖”。即,星号符号将被转录为符号:
如果“currentHero”为真,则将呈现为
但是如果您想要这样的条件输出呢:
..并且您不希望将输出 Package 在容器中。
你可以直接写去糖版本如下:
这将很好地工作。但是,现在我们需要ngIf使用括号[]代替星号 *,这会使人困惑(https://github.com/angular/angular.io/issues/2303)
因此,我们创建了一个不同的符号,如下所示:
两个版本将产生相同的结果(只有h1和p标签将被呈现)。第二个版本是首选,因为您可以像往常一样使用 *ngIf。
lrl1mhuk3#
在行为方面,这
相当于
那么您应该使用哪一个呢?
ng-container
是优选的,因为这样我们保留了结构指令用星号表示的惯例,例如*ngIf
、*ngFor
等。然而,在某些情况下,我们必须使用
template
来代替,例如,当你需要通过模板名称来引用template
标签时,例如<template #templateName>
。有关详细答案,请参见https://stackoverflow.com/a/40762236/7123519。
kyks70gy4#
ng-container
的Imo用例是一个简单的替代品,定制模板/组件可能会大材小用。使用一个ng-container来分组多个根节点
我想这就是它的意义所在分组。
请注意,
ng-container
指令福尔斯,而不是其指令 Package 实际内容的模板。q3qa4bjr5#
在我的情况下,它的行为就像一个
<div>
或<span>
,但即使<span>
搞砸了我的AngularFlex造型,但ng-container
没有。zz2j4svz6#
当你想使用一个带有 *ngIf和 *ngFor的表时,它的一个用例-因为在td/th中放置一个div会使表元素行为不当-。我遇到了这个问题,that是答案。