Angular ngrx/数据错误$stream-忽略以前的值

Angular ngrx/数据错误$stream-忽略以前的值,angular,rxjs,ngrx-data,Angular,Rxjs,Ngrx Data,我在我的应用程序中使用了ngrx/数据,我正在尝试找出如何使用error$流来显示组件中的错误。基本上,我使用带有表单的模式弹出窗口来创建实体,并且使用error$流来显示保存时发生的任何错误。我遇到的问题是,如果出现错误并显示,并且弹出窗口在下次打开时关闭,则会显示上一个错误。这是错误$选择器的代码 this.entityActionErrors$ = actions.pipe( filter( (ea: EntityAction) =>

我在我的应用程序中使用了ngrx/数据,我正在尝试找出如何使用
error$
流来显示组件中的错误。基本上,我使用带有表单的模式弹出窗口来创建实体,并且使用
error$
流来显示保存时发生的任何错误。我遇到的问题是,如果出现错误并显示,并且弹出窗口在下次打开时关闭,则会显示上一个错误。这是
错误$
选择器的代码

    this.entityActionErrors$ = actions.pipe(
      filter(
        (ea: EntityAction) =>
          ea.payload &&
          ea.payload.entityOp &&
          ea.payload.entityOp.endsWith(OP_ERROR)
      ),
      shareReplay(1)
    );
问题在于
shareReplay(1)
。我试图弄清楚,当模式被重新打开并且错误$stream被再次订阅时,如何忽略或过滤掉前面的错误


rxjs中有没有一种方法可以忽略或过滤掉sharedReplay主题之前发布的内容

我想出的解决方案是在错误消息中使用一个单独的主题。我在为实体创建的服务类中这样做

export class VolunteersService extends EntityCollectionServiceBase<Volunteer> {
  constructor(factory: EntityCollectionServiceElementsFactory) {
    super('Volunteer', factory);

    this.errors$
      .pipe(
        filter(
          (ea: EntityAction) =>
            ea.payload.entityName === 'Volunteer' &&
            ea.payload.entityOp === EntityOp.SAVE_ADD_ONE_ERROR
        )
      )
      .subscribe(() => this._addErrorSubject.next('We couldn\'t save your changes at the moment. Please try again later.'));
  }

  private _addErrorSubject = new Subject<string>();

  get addError$(): Observable<string> {
    return this._addErrorSubject;
  }
}

此解决方案工作正常,并将此状态保留在它所属的组件中和存储区之外。

跳过存储值很简单:
错误$.pipe(skipUntil(计时器(0));

它之所以有效,是因为存储值是同步提供的。

您还可以使用asyncScheduler。

也许该操作符在这里很有用?
this.modalErrors$=this.entityActionErrors$.pipe(distinctUntilChanged())
我已经尝试过了,但它不起作用。
shareReplay
主题适用于需要以前从流中发出的值的延迟订阅者。如果该值存在,我正在尝试过滤掉该值。我还尝试使用
跳过(1)
但这也不起作用。嗯。如果在关闭模式后发出一个空错误,然后您可以添加一个
过滤器
操作符,这样每当发出另一个错误时,消费者就能够成功地接收到它呢?我现在正在做类似的事情。我有一个单独的减速机来处理保存整个模式的状态当模式关闭时,我会发送一个重置操作。这会添加我认为不需要的额外代码。我认为有更好的解决方案(我现在正在尝试)是有一个单独的主题,每当$stream发出错误时都会发出。这解决了shareReplay主题的延迟订户问题。很有趣。找到解决方案后请共享!
  save() {
    this._pending = true;
    this.volunteersService.add(volunteer).subscribe(
      () => {
        this._pending = false;
      },
      error => {
        this._pending = false;
        this._error = error.message;
      }
    );
  }