从Angular4开始的ngIf新功能

来自菜鸟教程
跳转至:导航、​搜索

Angular 4 将在几天之内发布,并且对内置的 ngIf 模板指令 进行了很好的补充。 也就是说,我们现在可以定义一个用于 else 子句的模板,并且我们可以分配一个局部变量来保存 if 子句的结果值。

以下是如何为 ngIf 使用这两个新功能:

其他条款

所以过去是,为了将 else 子句作为 ngIf 语句的一部分,您必须改为创建另一个 ngIf 语句,并否定第一个语句:

<div *ngIf="likeThis">
  Like this!
</div>
<div *ngIf="!likeThis">
  Like that!
</div>

但是现在我们可以为使用 ng-template 定义的模板定义一个带有引用名称的 else 子句:

<div *ngIf="things.car; else noCar">
  Nice car!
</div>
<ng-template #noCar>
  Call a Uber.
</ng-template>

局部变量赋值

通常,if 语句的结果值不仅仅是布尔值 truefalse,而是您可能希望轻松引用的值。 使用新的 ngIf,您可以轻松地将 if 语句的结果分配给局部变量。 例如,我们的 things 对象在我们的组件类中看起来像这样:

things = {
  car: 'Honda',
  shoes: 'Nike',
  shirt: 'Tom Ford',
  watch: 'Timex'
};

您可以像这样引用 if 语句的结果:

<div *ngIf="things.car; let car">
  Nice {{ car }}!
</div>
<!-- Nice Honda! -->

您当然可以结合使用 else 子句和局部变量赋值:

<div *ngIf="things.car; else noCar; let car">
  Nice {{ car }}!
</div>
<ng-template #noCar>
  Call a Uber.
</ng-template>

ngIf 与异步管道

ngIf 指令的新功能在与异步管道结合使用时变得非常强大,正如 Angular 大学的 这篇文章 中所解释的。

例如,您可以使用 async 管道自动订阅 observable,使用 else 子句定义加载模板,并将 observable 的结果值放入局部变量中。

让我们创建一个简单的 observable 来说明:

// ...
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';

// ...
export class AppComponent {
  things$ = Observable.of({
    car: 'Honda',
    shoes: 'Nike',
    shirt: 'Tom Ford',
    watch: 'Timex'
  }).delay(1000);
}

我们的 observable 通过在发送数据前等待 1 秒来模拟网络调用。

现在,您可以使用 async 管道订阅 things$ 可观察对象,使用加载消息的模板定义 else 子句,并声明您可以使用的局部变量可观察对象获取数据后访问:

<div *ngIf="things$ | async; else loading; let things">
  Nice {{ things.watch }}! <!-- Nice Timex! -->
</div>
<ng-template #loading>
  Loading your things...
</ng-template>