【发布时间】:2020-10-25 19:25:48
【问题描述】:
在我们的 Angular 应用程序中,我们有一个加载器组件,它通过输入设置器属性接收一个 observable。
在 setter 中,我们首先将布尔值 isLoading 设置为 true,在模板内部开始显示加载微调器。 然后我们订阅 observable,当接收到数据时,isLoading 布尔值再次设置为 false,使微调器消失:
// loading-component template:
<ng-container *ngIf="data; else errorOrLoading">
...
</ng-container>
<ng-template #errorOrLoading>
...
</ng-template>
// loading-component class (short version without unsubscribe):
@Input() set data$(data$: Observable<any>) {
if (data$) {
this.data = null;
data$
.subscribe(data => {
this.data = data;
});
}
}
如果我们只有一个来自 Observable 的事件,这将非常有效。 但是当 Observable 发出多个事件时,isLoading 不会再次设置为 true,因为没有调用 setter。
有没有办法在给定的 Observable 链开始发出新事件之前动态添加一个额外的点击运算符,允许设置 this.data = null?
例如,如果 Observable 是:
myService.onChanges$.pipe(
switchMap(() => this.getBackendData())
);
我们可以动态添加一个将管道更改为:
myService.onChanges$.pipe(
tap(() => this.data = null),
switchMap(_ => this.getBackendData())
);
更新:我选择简化加载程序控制并将所有可观察的相关逻辑移至服务,这感觉更具可扩展性和灵活性。
【问题讨论】:
-
将数据设置为空真的是个好主意吗?更好的用户体验是在收到数据时显示初始数据并更新 ui。
-
如果我们还没有任何(新)数据,我们会在用户等待数据加载时显示一个微调器。在单击按钮会导致 onChange$ Observable 中的发射后,我们需要让用户知道正在加载某些内容
-
@Andre 这是某种搜索功能吗?每次用户点击按钮时是否需要加载新数据?
-
@OlegKuibar 不,这只是一个在获取数据时显示微调器的组件
标签: angular dynamic rxjs operator-keyword