角为什么星号 (*)

IT技术 javascript angular angular-directive
2021-03-21 16:21:56

在 Angular 文档中,* 和 template,我们知道 *ngIf, *ngSwitch, *ngFor 可以扩展为 ng-template 标签。我的问题是:

我觉得ngIf还是ngFor没有*也可以翻译并通过角引擎扩展到模板标签。

以下代码

<hero-detail *ngIf="currentHero" [hero]="currentHero"></hero-detail>

将与

<ng-template [ngIf]="currentHero">
  <hero-detail [hero]="currentHero"></hero-detail>
</ng-template>

那么为什么要*在 Angular 中设计一个奇怪的符号星号()呢?

5个回答

Asterisk 语法是更冗长的模板语法的语法糖,它的指令扩展到引擎盖下,您可以自由使用这些选项中的任何一个。

来自文档的引用

星号是“语法糖”。它为作者和读者简化了 ngIf 和 ngFor。在幕后,Angular 用更详细的形式替换了星号版本。

接下来的两个 ngIf 示例实际上是相同的,我们可以用任何一种风格编写:

<!-- Examples (A) and (B) are the same -->

<!-- (A) *ngIf paragraph -->
<p *ngIf="condition">
  Our heroes are true!
</p>

<!-- (B) [ngIf] with template -->
<template [ngIf]="condition">
  <p>
    Our heroes are true!
  </p>
</template>
为什么在 ng1 中没有星号就可以写 ng-if、ng-show 等?
2021-04-22 16:21:56
@RubberDuckRabbit 因为 ng1 具有完全不同的绑定实现。它是为 ng2+ 重新设计的。
2021-05-03 16:21:56
我能想到的原因有几个: 1.ngIf="expression"不是输入绑定。如果您从 DOM 获取值,它将是一个字符串。2. 框架需要了解ngIf其他特殊情况。当然,在 DDO 的某处指定一个布尔属性就可以了,但是你必须查看代码/文档才能知道常规属性和结构指令糖之间的区别。3. 方括号、星号、圆括号和缺少它们清楚地向模板阅读器传播正在发生的事情。
2021-05-10 16:21:56
我的意思是为什么要设计这个糖,为什么不使用 *.
2021-05-14 16:21:56
好吧,遗憾的是,Angular 的开发人员当然不喜欢“漂亮”的语法。
2021-05-17 16:21:56

Angular2 提供了一种特殊的指令——结构指令

结构指令基于<template>标签。

*属性之前选择指示的结构指令应被施加的,而不是正常的属性指令或属性的绑定。Angular2 在内部将语法扩展为显式<template>标记。

由于 final 还有一个<ng-container>元素,它可以与<template>标签类似地使用,但支持更常见的简写语法。例如,当两个结构指令应用于一个不受支持的元素时,这是必需的。

<ng-container *ngIf="boolValue">
  <div *ngFor="let x of y"></div>
</ng-container>

Angular 以一种特殊的方式处理模板元素。*语法是一个快捷方式,可以让你避免写入整个<template>元素。让我告诉你它是如何工作的。

使用这个

*ngFor="let t of todos; let i=index"

翻译成

template="ngFor: let t of todos; let i=index" 

然后转换为

<template ngFor [ngForOf]="todos" .... ></template>

也Agular的结构指令喜欢ngForngIf等前缀由*刚刚从其他自定义指令和组件进行区分

在这里查看更多

来自Angular 文档

结构指令负责 HTML 布局。它们通常通过添加、删除或操作元素来塑造或重塑 DOM 的结构。

与其他指令一样,您将结构指令应用于宿主元素该指令然后对该宿主元素及其后代执行它应该做的任何事情。

结构指令很容易识别。星号 (*) 位于指令属性名称之前,如本例所示。

<p *ngIf="userInput">{{username}}</p>

有时您可能需要<a *ngIf="cond">例如,当它只有一个标签时。有时您可能希望将 ngIf 放在多个标签周围,而没有真正的标签作为包装器来引导您进行<template [ngIf]="cond">标记。angular 如何知道它是否应该在最终结果 html 中呈现 ngIf 指令所有者?所以这不仅仅是让代码更清晰。这是一个必要的区别。