【问题标题】:Async pipe still executing despite *ngIf evaluating to false尽管 *ngIf 评估为 false,但异步管道仍在执行
【发布时间】:2017-01-04 15:48:44
【问题描述】:

我在使用异步管道时遇到问题,因为我想要一个能够同时依赖异步和静态数据的列表。但是,我无法理解如何巧妙地做到这一点。

现在看起来是这样的:

<ul>
  <li *ngIf="true" *ngFor="let item of list">{{item}}</li>
  <li *ngIf="false" *ngFor="let item of list | async">{{item}}</li>
</ul>

这是非常烦人的部分,即使*ngIf 是假的,异步管道仍然会尝试做它的事情。导致应用程序崩溃并抛出错误,指出异步管道的参数类型错误,因为它需要一个承诺而不是数组。

所以我的问题是,它为什么要这样做,什么是实现我想要的更好、更正确的方法?

【问题讨论】:

  • 在您的组件中设置布尔变量 true 或 false 的值。

标签: asynchronous angular angular2-pipe


【解决方案1】:

更改模型,以便即使您的数据是静态的,模板也可以成为可观察的。这可以通过Observable.of()轻松完成

例如,假设您通常从 getData() 函数获取 observable,但是当数据是静态的时,您从 getStaticData() 函数获取它。你会这样做:

型号

if(isDataStatic){
    //convert static data into an observable that emits that data
    this.list = Observable.of(this.getStaticData());
}else{
    //however you typically get the observable
    this.list = this.getData();
}

因此,list 将始终是可观察的,即使您的数据是静态的。模板可以保持简单。

模板

<ul>
  <li *ngFor="let item of list | async">{{item}}</li>
</ul>

【讨论】:

  • Hmm.. 知道如何在模板加载之前在组件内部将列表转换为 observable(如果它已经不是一个)吗?
  • @Chrillewoodz Observable.of(this.list) 将返回一个发出列表的 Observable。
  • 是的,我知道,但是如何检查它是否是 Observable?
  • @Chrillewoodz this.list instanceof Observable 将返回 true 如果它是一个 Observable。见github.com/Microsoft/TypeScript/blob/v1.8.10/doc/spec.md#4.19.4
最近更新 更多