ChatGPT解决这个技术问题 Extra ChatGPT

在 Angular 2 中使用没有额外元素的 ngIf

我可以在没有额外容器元素的情况下使用 ngIf 吗?

<tr *ngFor="...">
  <div *ngIf="...">
    ...
  </div>
  <div *ngIf="!...">
    ...
  </div>
</tr>

它在表格中不起作用,因为这会使 HTML 无效。


C
Community

ng-container 优于 template

<ng-container *ngIf="expression">

看:

Angular 2 ng-container

https://github.com/angular/angular.io/issues/2303


您应该添加一个示例“生成”HTML 片段,以明确没有创建 HTML 元素。
我每天来这里两次。我不能把它留在我的脑海里。
在我们的例子中,ng-container 似乎生成了一个 div
j
janispritzkau

我在 https://angular.io/docs/ts/latest/guide/template-syntax.html#!#star-template 上找到了一种方法。

您可以像这样简单地使用 <template> 标记并将 *ngIf 替换为 [ngIf]

<template [ngIf]="...">
  ...
</template>

很好,但 *ngIf itslef 创建一个 template 标记,默认情况下,带有 * 前缀的角度指令会创建一个模板标记。所以两者都是相同的[ngIf] and *ngIf
使用 *ngIf,您在模板中有一个元素,如果您自己编写 template,则没有。在某些情况下,额外的元素可能会干扰。
我们可以把 template 标签放在 tr/td 标签里面吗?
是的,它是一种特殊的元素。根据定义,它是不允许的 w3.org/TR/html401/struct/tables.html#h-11.2.3,但它会工作并呈现。如果我正在使用 *ngIf 它不工作顺便说一句。但是使用 [ngIf] 可以。请问你能告诉我这是为什么吗?
@sascha10000 因为拥有 *ngIf="foo" 等同于包装 <template [ngIf]="foo"> 标记。简而言之,template + [] == *,所以 [] != ** 在任何元素 除了 template 中都有意义。
P
Pankaj Parkar

您不能将 div 直接放在 tr 中,否则会导致 HTML 无效。 tr 中只能包含 td/th/table 元素 &在它们里面你可以有其他的 HTML 元素。

您可以稍微更改您的 HTML 以使 *ngFor 超过 tbody &将 ngIf 置于 tr 之上,如下所示。

<tbody *ngFor="...">
  <tr *ngIf="...">
    ...
  </tr>
  <tr  *ngIf="!...">
    ...
  </tr>
  ..
</tbody>

它基本上可以解决问题,但您将权衡使用 tbody 获得的核心能力。如果你有一张大桌子,你可以修复头部,只需滚动 tbody。您的 tbody 将具有 tr 的角色,而 tr 将具有附加包装器的角色。如果不需要滚动并将头部固定在顶部,这是一个实用的解决方案。我所说的参考:w3.org/TR/html401/struct/tables.html#h-11.2.3
S
Sourabh Shah

添加括号可解决此问题

 <ng-container *ngIf="(!variable| async)"></ng-container>

J
Jitendra

你可以试试这个:

<ng-container *ngFor="let item of items;">
    <tr *ngIf="item.active">
        <td>{{item.name}}</td>
    </tr>
 </ng-container>
 

在这里,我在 ng 容器中进行了迭代循环,因此如果我想渲染或不渲染,它不会创建额外的 dom 和 tr 标签检查条件。