当使用的AsyncPipe
内部时*ngIf
,如果Observable
连接到AsyncPipe
push的值在*ngIf
true之前变为其值,则从返回的值AsyncPipe
将是错误的。
例如,假设我有:
<div *ngIf="showPipe">
<div *ngFor="let item of arrObs | async">{{item}}</div>
</div>
然后说事件按此顺序发生:
showPipe
是假的arrObs
推[1,2,3]showPipe
设置为true从我所看到的,*ngFor
将充当好像arrObs | async
返回null。
解决此问题的一种方法是[hidden]
改用,但是这样做有很多好处*ngIf
,例如性能和使null处理更容易。
正确的方法是什么?我是否应该完全不使用可观察对象来显示内容?我以为使用可观察的方法是最Angular-y的工作方式。
编辑:我的观察到实际上只是new Subject()
我呼吁next()
。
有一些方法可以解决此问题。我建议在上添加一个shareReplay
运算符Observable
:
readonly arrObs = this.someDataFromSomewhere().pipe(
shareReplay(1)
);
如果您Observable
实际上是Subject
,也可以将其更改为BehaviorSubject
或ReplaySubject
这样,您将始终收到有关订阅的最新数据。
还有一些方法可以在模板中处理此问题并仍然保持其*ngIf
优势:
<ng-container *ngIf="arrObs | async as arr">
<div *ngIf="showPipe">
<div *ngFor="let item of arr">{{item}}</div>
</div>
</ng-container>
或者,如果您不想*ngIf
等待可观察的
<ng-container *ngIf="{ arr: arrObs | async } as data">
<div *ngIf="showPipe">
<div *ngFor="let item of data.arr">{{item}}</div>
</div>
</ng-container>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句