【发布时间】:2021-10-20 17:51:16
【问题描述】:
我的模板有类似...
<div> {{ (profile$ | async).username}}</div>
<div> {{ (profile$ | async).email}}</div>
有没有办法将 (profile | async) 分配给局部变量?必须为每个字段都输入它不利于可读性。
谢谢。
【问题讨论】:
标签: angular
我的模板有类似...
<div> {{ (profile$ | async).username}}</div>
<div> {{ (profile$ | async).email}}</div>
有没有办法将 (profile | async) 分配给局部变量?必须为每个字段都输入它不利于可读性。
谢谢。
【问题讨论】:
标签: angular
从 Angular 4.0.0-rc.1 (2017-02-24) 开始,您可以使用增强的 *ngIf 语法。这让您可以在模板局部变量中分配 *ngIf 条件的结果:
<div *ngIf="profile$ | async as profile">
<div>{{profile.username}}</div>
<div>{{profile.email}}</div>
</div>
更新后的*ngIf documentation 更加详细,并提供了许多同时使用async 和*ngIf 的好例子。
请务必查看*ngIf 的then 和else 语句。
Cory Rolan 制作了一个short tutorial,您可以在 5-10 分钟内消化。
【讨论】:
最好的方法是创建一个新组件,例如在这种情况下 app-profile 并将 profile | async 传递给该组件。在组件内部,您可以随意命名变量。
<app-profile [profile]="profile | async"></app-profile>
另一种方法是使用 *ngIf 和 'as' 语法
<ng-container *ngIf="profile | async as p">
<div> {{ p.username }}</div>
<div> {{ p.email }}</div>
</ng-container>
【讨论】:
这有点老套,但我似乎有很多这样的例子:
<template ngFor let-profile [ngForOf]="profile$ | async">
<div> {{ profile.username }}</div>
<div> {{ profile.avatar }}</div>
<div> {{ profile.email }}</div>
...
</template>
【讨论】:
<div *ngFor="let profile of profile$ | async">有何不同?
<div> 包装器。 <template> element 不生成任何输出,仅用于定义布局中的块,但 <template> 不支持短语法 (*ngFor),仅支持长语法。
template 简单地将变量分配给可观察对象的最新值,而不是要循环的数组吗?
有一个替代方案,但它更乏味。 Günter Zöchbauer 提出的解决方案缓解了这一事实。
另一种方法是订阅组件内部的 observable,然后在模板中使用订阅变量。您必须在 OnDestroy 事件中取消订阅以防止内存泄漏。异步管道为你做这件事。这就是为什么公认的解决方案更清洁的原因。但是,如果您不想创建新组件,这是可行的方法。
【讨论】:
如果您想访问内部vm$ 上的对象,例如这种类型vm$: Observable<{ profile: {} }>;
试试下面的 sn-p,不要忘记? 标记。
<ng-container *ngIf="(vm$ | async)?.profile as profile">
<div> {{ profile.username }}</div>
<div> {{ profile.email }}</div>
</ng-container>
【讨论】: