如何在 Angular 中使用 ng-container 元素

介绍

ng-container 是 Angular 2+ 中可用的元素,可以充当结构指令的宿主。

在本文中,您将探索可以使用ng-container.

先决条件

如果你想跟随这篇文章,你需要:

  • 熟悉DOM的结构。要了解更多信息,请查看了解 DOM教程系列
  • 熟悉 Angular模板结构指令也可能有所帮助。

使用ng-container以避免多余的元素

在 Angular 中,您不能在一个元素上使用多个模板绑定。

此示例组合*ngIf*ngFor结构指令不会编译:

Invalid Example
<div *ngIf="todos" *ngFor="let todo of todos"> {{ todo.content }} </div>

尝试编译此代码将导致以下错误:

Invalid Example Output
Can't have multiple template bindings on one element. Use only one attribute prefixed with *

一种解决方法是分离模板绑定并创建一个包装器:

Valid Example
<div *ngIf="todos"> <div *ngFor="let todo of todos"> {{ todo.content }} </div> </div>

一个缺点是这种方法div向 DOM引入了一个冗余元素:

Valid Example Output
<div> <div> Todo Content 1 </div> <div> Todo Content 2 </div> <div> Todo Content 3 </div> </div>

这是ng-container元素变得有用的地方。

以下行为完全相同,但不会在运行时向 DOM 添加任何额外元素:

Improved Valid Example
<ng-container *ngIf="todos"> <div *ngFor="let todo of todos"> {{ todo.content }} </div> </ng-container>

这将导致以下标记:

Improved Example Output
<div> Todo Content 1 </div> <div> Todo Content 2 </div> <div> Todo Content 3 </div>

ng-containerngIf用于内联内容的情况下也很有用:

Example
<div> <span *ngIf="error">Oops:</span> {{ message }} </div>

如果error为真,这将导致以下标记:

Example Output
<div> <span>Oops:</span> An error occurred. </div>

用 替换span元素ng-container将减少span添加到 DOM 的冗余元素:

Improved Example
<div> <ng-container *ngIf="error">Oops:</ng-container> {{ message }} </div>

如果error为真,这将导致以下标记:

Improved Example Output
<div> Oops: An error occurred. </div>

减少应用程序中的标记数量最终会导致 DOM 树变小,并且可以帮助避免级联样式表选择器的副作用。

使用ng-container以确保有效的HTML标准

ng-container还可以解决在使用divspan不是有效 HTML 的情况下无效 HTML 标记的问题

下面的例子会产生无效的 HTML,因为li元素应该是元素的直接子ul元素:

Invalid Example
<ul> <div *ngFor="let todo of todos"> <li *ngIf="todo.content !== 'Done'"> {{ todo.content }} </li> </div> </ul>

更换divng-container解决此问题:

Valid Example
<ul> <ng-container *ngFor="let todo of todos"> <li *ngIf="todo.content !== 'Done'"> {{ todo.content }} </li> </ng-container> </ul>

拥有有效的 HTML 将满足更严格的测试和要求,并确保跨浏览器和设备的支持。

结论

在本文中,您探索了ng-containerAngular 应用程序解决的问题,例如冗余元素和无效的 HTML 标准。

如果您想了解有关 Angular 的更多信息,请查看我们的 Angular 主题页面以获取练习和编程项目。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁