如何基于 NgRX 存储数据组成 Angular 守卫

Posted

技术标签:

【中文标题】如何基于 NgRX 存储数据组成 Angular 守卫【英文标题】:How to compose Angular guard based on NgRX store data 【发布时间】:2019-05-13 18:38:51 【问题描述】:

我正在尝试创建一个守卫来检查路由参数的值是否出现在位置列表(放置在 NgRX 存储中)。

问题是当我过滤位置时,我只从流locations.length 中获得第一个结果,返回 0 并且 Observable 正在关闭。你能以某种方式纠正我吗?位置可能尚未加载。我想等待它们被加载到商店,然后才检查参数。

canActivateChild(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> 
    return this.locationFacade.locations$.pipe(
      filter(locations => !!locations.length),
      map((locations: Array<Location>) => locations.some(x => x.name === next.params['locationName']))
    );
  

【问题讨论】:

【参考方案1】:

我认为更好的解决方案是引入加载状态,而不是检查length。比如:

canActivateChild(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> 
    return this.locationFacade.locations$.pipe(
      filter(locations => locations.state === 'LOADED'),
      map((locations: Array<Location>) => locations.some(x => x.name === next.params['locationName']))
    );
  

【讨论】:

以上是关于如何基于 NgRX 存储数据组成 Angular 守卫的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular ngrx 存储效果按 id 查询数据

在单元测试中使用参数模拟 ngrx 存储选择器(Angular)

如何从ngrx存储中删除所有数据?

在 angular/ngrx 应用程序中将状态保存到本地存储的逻辑的位置

在 Angular 中使用 ngrx 进行状态管理时,控制台记录状态数据

Angular 7、Ngrx、Rxjs 6 - 访问延迟加载模块之间的状态