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