我正在开发一个功能,您可以通过不同的标准过滤实体。选定的标准反映在 UI 过滤器和芯片中。这个想法是将过滤器存储在 URL 中。
申请流程如下:
=> queryParams are parsed and mapped to filters
=> filters are stored in store
=> chips are calculated based on filters
=> api call is triggered to fetch data
Run Code Online (Sandbox Code Playgroud)
当 UI 事件发生时,ngrx/effect 会处理它,例如。我们想通过单击芯片来删除过滤器。Effect 方法获取单击的芯片和当前状态,然后从中计算 queryParams 并使用新的 queryParams 触发导航。效果管的最后一个元素如下所示:
const filters = selectFilters(storeState);
filter.removeValue(value);
return this.router.navigate(['some route'], {
queryParams: filters.toQueryParams()
});
Run Code Online (Sandbox Code Playgroud)
看起来我的作用是进行某种状态管理,这让我感到惊讶。
我将非常感谢这种方法的验证。
我想在flatMap中有一个条件来检查第一个observable返回的内容.如果条件不满足,我想打破并导航到不同的页面.
this.service.getData(id)
.flatMap((data) => {
if (!data) {
return Observable.throw(new NoDataFoundError());
}
return Observable.forkJoin(
this.service.getData2(id2),
this.service.getData3(id3),
);
})
.subscribe(
([data2, data3]) => {
this.data2= data2;
this.data3= data3;
},
(err) => {
if (err instanceof NoDataFoundError) {
this.router.navigate(...);
}
}
);
Run Code Online (Sandbox Code Playgroud)
目前我正在抛出特定错误并捕获它但是我不喜欢这个解决方案,因为它不是唯一可能引发错误的代码片段而if不是缩放.
我考虑过filter或takeWhile操作符,但我无法执行重定向.
我还考虑过返回Observable.of而不是扔(第4行),但后来我必须在订阅中做if也闻起来.