我在我的应用程序中使用 ngrx/data 并试图找出如何使用 error$
流来显示组件中的错误。基本上,我使用带有表单的模式弹出窗口来创建实体,并且我使用 error$
流来显示保存时发生的任何错误。我遇到的问题是,如果发生错误并显示错误,并且在下次打开时关闭弹出窗口,则会显示上一个错误。这是 error$
选择器的代码
this.entityActionErrors$ = actions.pipe(
filter(
(ea: EntityAction) =>
ea.payload &&
ea.payload.entityOp &&
ea.payload.entityOp.endsWith(OP_ERROR)
),
shareReplay(1)
);
问题出在 shareReplay(1)
上。我试图弄清楚如何在重新打开模式并再次订阅错误 $ 流时忽略或过滤掉之前的错误。
在 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;
}
}
我试图解决的问题是本地组件状态的问题,所以虽然这确实有效,但我决定采用不同的解决方案。在 ngrx/data 中,EntityCollectionServiceBase
类中的所有命令方法都会返回一个 Observable,该 Observable 在存储更新后发出。所以在组件中我订阅了如下命令方法:
save() {
this._pending = true;
this.volunteersService.add(volunteer).subscribe(
() => {
this._pending = false;
},
error => {
this._pending = false;
this._error = error.message;
}
);
}
此解决方案完美运行,并将此状态保存在它所属的组件中并保存在商店外。
关于angular - ngrx/data error$ stream - 忽略之前的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59313648/