我正在尝试在警卫中构建一系列 RXJS 命令,以便在一个简单的库(如书籍)应用程序中实现此结果:
- 在商店中检查
- 如果状态没有加载,触发一个动作
- 加载后,过滤数据以找到一个特定项目
- 如果找到,允许访问页面,如果没有,发送到 404
我已经苦苦挣扎了一段时间,并且根据 Angular 6 版或标准,在网上查看并没有给出答案......如果商店在击中警卫之前加载,我已经成功地做了什么来创建它,但如果它需要获取数据,它会无限循环。
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
return this.store.pipe(
select(state => state.books),
tap(state => {
if (!state.loaded) {
this.store.dispatch(new BooksActions.Load());
}
}),
filter(state => state.loaded),
take(1),
map(state => state.list.find(book => book.id === route.params['id'])),
map((book) => {
if(!!book) return true;
this.router.navigate(['/404']);
return false;
})
);
}
非常感谢!