ngIf指令中的异步管道

multitaskPro

当使用的AsyncPipe内部时*ngIf,如果Observable连接到AsyncPipepush的值在*ngIftrue之前变为其值,则从返回的值AsyncPipe将是错误的。

例如,假设我有:

<div *ngIf="showPipe">
    <div *ngFor="let item of arrObs | async">{{item}}</div>
</div>

然后说事件按此顺序发生:

  1. showPipe 是假的
  2. arrObs 推[1,2,3]
  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,也可以将其更改为BehaviorSubjectReplaySubject

这样,您将始终收到有关订阅的最新数据。

还有一些方法可以在模板中处理此问题并仍然保持其*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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章