尽管 *ngIf 评估为 false,异步管道仍在执行
Async pipe still executing despite *ngIf evaluating to false
我在使用异步管道时遇到问题,因为我想要一个能够依赖于异步数据和静态数据的列表。然而,我不明白如何巧妙地做到这一点。
现在看起来像这样:
<ul>
<li *ngIf="true" *ngFor="let item of list">{{item}}</li>
<li *ngIf="false" *ngFor="let item of list | async">{{item}}</li>
</ul>
这里是非常烦人的部分,即使 *ngIf
为 false,异步管道仍会尝试执行它的操作。导致应用程序崩溃并抛出错误,指出异步管道的参数类型错误,因为它需要一个承诺而不是一个数组。
所以我的问题是,它为什么要这样做,什么是实现我想要的效果的更好、更正确的方法?
更改模型,以便即使您的数据是静态的,模板也可以观察到。这可以通过 Observable.of()
轻松完成
例如,假设您通常从 getData()
函数获取可观察对象,但是当数据是静态数据时,您从 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>
我在使用异步管道时遇到问题,因为我想要一个能够依赖于异步数据和静态数据的列表。然而,我不明白如何巧妙地做到这一点。
现在看起来像这样:
<ul>
<li *ngIf="true" *ngFor="let item of list">{{item}}</li>
<li *ngIf="false" *ngFor="let item of list | async">{{item}}</li>
</ul>
这里是非常烦人的部分,即使 *ngIf
为 false,异步管道仍会尝试执行它的操作。导致应用程序崩溃并抛出错误,指出异步管道的参数类型错误,因为它需要一个承诺而不是一个数组。
所以我的问题是,它为什么要这样做,什么是实现我想要的效果的更好、更正确的方法?
更改模型,以便即使您的数据是静态的,模板也可以观察到。这可以通过 Observable.of()
例如,假设您通常从 getData()
函数获取可观察对象,但是当数据是静态数据时,您从 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>