我是 Angular2+ 和 RxJs 的新手,所以如果我问一些明显的问题,我很抱歉。
功能性
当数据刚刚开始加载、startAction
发出、isLoaded
转动false
并显示微调器时。
一旦数据被加载,endAction
被发射, isLoaded 被设置为true
。微调器被隐藏起来,并描绘了主要数据。
一旦用户单击另一个按钮,就会加载另一数量的数据。startAction
再次发出,微调器将再次显示,直到数据加载。
我有的
在组件中:
this.startAction.subscribe(() => {this.isLoaded = false;});
this.endAction.subscribe(() => {this.isLoaded = true;});
在模板中:
<ng-container *ngIf="isLoaded; else loading">
...data...
</ng-container>
<ng-template #loading>
<mat-spinner></mat-spinner>
</ng-template>
我需要的
一切都很好,但我需要重新设计这种方法,使其更具反应性。我必须摆脱订阅并isLoaded
变成可观察的才能通过async
模板中的管道使用它。
我试过的
在组件中:
isStartLoading = this.startAction.pipe(mapTo(false));
isEndLoading = this.endAction.pipe(mapTo(true));
isLoaded = combineLatest([this.isStartLoading, this.isEndLoading])
.pipe(takeLast(1)); // does not emit
//.pipe(last()); // does not emit
//.pipe(take(1)); // emits only once
在模板中:
<ng-container *ngIf="isLoaded | async; else loading">
...
我的解释
根据我的理解,必须在andtakeLast(1)
之间发出最后一个动作。所以当发生时,应该发出一个 observable over ,when -一个 observable over 。isStartLoading
isEndLoading
startAction
takeLast(1)
false
endAction
true
出于某种原因,我只看到了初始微调器,并且没有描述结果数据。看起来我对combineLatest
+takeLast
应该如何协同工作有错误的理解。
当我tap(console.log)
在takeLast(1)
/之后添加时last()
,我看到它永远不会发出。但是当用 替换它时take(1)
,它预计只会发出一次。所以我看到了微调器,然后是数据,然后在单击另一个按钮后 - 新加载的数据有延迟且没有微调器,因为我们只采用第一个。
任何帮助表示赞赏!