仅获取新发出的值

时间:2019-03-14 08:04:51

标签: angular rxjs

在我的角度应用程序中,我使用ngxs库作为商店。 我有获取last edited id的方法:

return this.store.select((state: AppStateModel) => state.lastEditedId)
      .pipe(filter(id => id > 0));

我将其用于更改表单中的选项。像这样:

this._options$ = merge(
      /**
       * Init value from query param
       */
      initValue$.pipe(tap(i => console.log('initValue$', i)), take(1)),
      /**
       * Last edited id
       * Here I want only newly emitted values, but I also get old one.
       */
      this.obiektySelectors.lastEditedId()
        .pipe(
          tap(i => console.log('lastEditedId', i)),
          distinctUntilChanged(),
        ),
);

问题是,当我在lastEditedId中有价值时,它总是进入this._options$流中。我知道它没有发出。 我可以强制观测器仅采用发射的值吗?

1 个答案:

答案 0 :(得分:1)

我想到的唯一想法是创建单独的主题,该主题将订阅lastEditedId()并重新发送ID。

const idChanges = new Subject();
this.obiektySelectors.lastEditedId().subscribe(id => idChanges.next(id));

然后,您可以在合并中使用此主题。由于Subject不存储最后一个值,因此它将仅发出新的ID。

this._options$ = merge(
      /* ... */
      idChanges
        .pipe(
          tap(i => console.log('lastEditedId', i)),
          distinctUntilChanged(),
        ),
);

此处是即兴演示,https://stackblitz.com/edit/rxjs-8vugyz