角度(可观察):合并中的更新间隔

时间:2020-10-08 15:11:20

标签: angular typescript rxjs observable

我想知道如何在更新表中的数据时更改合并中的间隔值:

 merge(this.sort.sortChange, this.paginator.page, interval(this.delay))
      .pipe(
        startWith({}), // ... fetch data

当我单击一行时,我需要在对话框打开时不更新表,因此我想在此间隔中放置一个大计时器(或者如果您有更好的解决方案,或者如果您知道获取TS中的最大日期也很受欢迎^^')

  selectRow(row: GithubIssue) {
    this.selection.select(row);
    this.delay = 10000000;

    const dialogRef = this.dialog.open(DialogComponent);
      dialogRef.afterClosed().subscribe(() => {
        this.selection.clear();
        this.delay = 30000;
      });
  }

如果可以帮助我,我已经进行了一次堆栈闪电式仓库:repo stackblitz

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以制作一个间隔流,该间隔流可以通过切换主题进行切换。假设全局范围内有keepUpdating$ = new BehaviorSubject<boolean>(true);

toggleInterval$ = keepUpdating$.pipe(
  switchMap(update =>
    update? interval(this.delay) : EMPTY
  )
);

merge(this.sort.sortChange, this.paginator.page, toggleInterval$)
  .pipe(
    startWith({}), // ... fetch data

然后您可以像这样使用它:

selectRow(row: GithubIssue) {
  this.selection.select(row);
  this.keepUpdating$.next(false);

  const dialogRef = this.dialog.open(DialogComponent);
    dialogRef.afterClosed().subscribe(() => {
      this.selection.clear();
      this.keepUpdating$.next(true);
    });
 }

旁注:

像这样轮询您的后端/数据库可能是一个错误的设计选择。如果要实时更新表,则在等待任何更新时让表打ic(带有加载动画)会给用户带来不好的体验。相反,您应该考虑在后台执行更新,并在准备好显示更新时将其推送到表中。

然后无需检查间隔,只需在更改准备就绪时推送更改即可。

答案 1 :(得分:0)

我会用skipWhile运算符来尝试。像

.pipe(
  skipWhile(() => this.dialogRef && this.dialogRef.getState() === MatDialogState.OPEN)
)