ng2-ng容器和ng-template标签之间的区别


93

有人可以说明使用<ng-container><ng-template>元素之间的区别吗?

我找不到文档NgContainer,也不太了解模板标记之间的区别。

每个代码示例将极大地帮助。

Answers:


101

目前,这两个参数(2.x,4.x)都用于将元素分组在一起,而不必引入将在页面上呈现的另一个元素(例如divspan)。

template,但是需要讨厌的语法。例如,

<li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>

会成为

<template ngFor let-item [ngForOf]="items" let-i="index" [ngForTrackBy]="trackByFn">
  <li>...</li>
</template>

您可以改用ng-container它,因为它遵循*您期望的并且可能已经很熟悉的漂亮语法。

<ng-container *ngFor="let item of items; let i = index; trackBy: trackByFn">
  <li>...</li>
</ng-container>

您可以通过阅读GitHub上的讨论找到更多详细信息。


请注意,<template>不建议在4.x中将其更改为<ng-template>



8
“讨厌的语法”可能有点夸张了:D这是将值传递给@Input()s 的正常语法。*当然更方便。但是您是对的,<ng-container>因为语法差异引起了相当多的混乱而被介绍。
君特Zöchbauer

1
<ng-container>不会在DOM中引入新元素。<ng-template>呢?请在您的答案中阐明。
乔蒂·普拉萨德

此页面帮助我弄清楚了什么:blog.angular-university.io/…
米克斯(Mikser)'18年

如何将n容器与ngFor一起使用以渲染表的行?我正在尝试这个,但是没有用。我想有条件地渲染行,这样我就可以在row元素上使用ngFor。
Ahsan

18

ng-template用于类的结构指示ng-ifng-forng-switch。如果在不使用结构指令的情况下使用它,则不会发生任何事情,并且它将呈现。

ng-container在没有合适的包装器或父容器时使用。在大多数情况下,我们使用divspan作为容器,但在这种情况下,当我们要使用多个结构指令时。但是我们不能在一个元素上使用多个结构指令,在这种情况下,ng-container可以将其用作容器


5

ng-template
<ng-template>是用于呈现HTML的Angular元素。它永远不会直接显示。用于结构指令,例如:ngIf,ngFor,ngSwitch等。
示例

<div *ngIf="hero" class="name">{{hero.name}}</div>

Angular将* ngIf属性转换为一个<ng-template>元素,包裹在宿主元素中,如下所示。

<ng-template [ngIf]="hero">
  <div class="name">{{hero.name}}</div>
</ng-template>

ng-container
在没有合适的宿主元素时用作分组元素。
例:

<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>

这是行不通的。因为某些HTML元素要求所有直接子代都属于特定类型。例如,<select>元素需要子元素。您不能将选项包装成条件或<span>

试试这个 :

<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>

这将起作用。

详细信息:角结构指令


3

ng-template显示真实价值。

<ng-template>
    This is template block
</ng-template>

输出:

没有条件的ng-container show也显示内容。

<ng-container>
    This is container.
</ng-container>

输出:
这是容器。


1

ng-template顾名思义,表示模板。它本身不呈现任何内容。我们可以使用ng-container提供占位符来动态呈现模板。

的另一个用例ng-template是,我们可以使用它将多个结构指令嵌套在一起。您可以在此博客文章中找到出色的示例:angular ng-template / ng-container


0

简单来说,ng-container就像React的Higher组件,它仅有助于呈现其子元素。

ng-template基本上是Angular的内部实现,其中ng-template渲染时会完全忽略里面的所有内容,并且基本上成为对视图源的注释。这应该与角的内部指示等一起使用ngIfngSwitch等等。


0

我喜欢<ng-container>在Angular .component.html文件中尽可能地将“逻辑”与“标记”分开的一种方法。

(部分)示例呈现html表的行:

        <ng-container *ngFor="let product of products">
          <tr>
            <td></td>
            <td>{{ product.productName }}</td>
            <td>{{ product.productCode }}</td>
            <td>{{ product.releaseDate }}</td>
            <td>{{ product.price }}</td>
            <td>{{ product.starRating }}</td>
          </tr>
        </ng-container>

这样,如果我想从HTML更改<table>为其他内容(例如<div>使用flexbox样式的样式),则无需从中“切出”循环逻辑(或冒着完全丢失循环逻辑的风险)<tr>。它还可以防止循环(ngFor)逻辑被普通的html所部分掩盖。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.