Angular canActivate()路由保护返回true,但不返回路由未加载

Angular canActivate()路由保护返回true,但不返回路由未加载,angular,rxjs,ngrx,Angular,Rxjs,Ngrx,我正在使用路由保护从NgRX存储获取数据,并在路由解析之前触发(如果需要)API请求从存储加载数据。本质上,我们等待实体在存储中定义,等待布尔标志将其标记为已完成加载,然后可观察对象发出true,路由应该解析 然而,尽管在canActivate()中可以观察到成功发射,但路由没有加载,我看不出有什么原因。流的行为与预期一致,直到该点:firstloaded为false,实体未定义。然后,一旦API调用完成,实体就被定义,最后加载的布尔值变成true。然后,过滤器允许我们通过,并且“加载pls”c

我正在使用路由保护从NgRX存储获取数据,并在路由解析之前触发(如果需要)API请求从存储加载数据。本质上,我们等待实体在存储中定义,等待布尔标志将其标记为已完成加载,然后可观察对象发出
true
,路由应该解析

然而,尽管在
canActivate()
中可以观察到成功发射,但路由没有加载,我看不出有什么原因。流的行为与预期一致,直到该点:first
loaded
为false,实体
未定义。然后,一旦API调用完成,实体就被定义,最后加载的
布尔值变成
true
。然后,过滤器允许我们通过,并且“加载pls”console.log显示一次。在这一点上,路线现在应该加载了吗

  canActivate(): Observable<boolean> {
    return this.getEntity().pipe(
      switchMap(() => {
        console.log('load pls');
        return of(true);
      }),
      catchError(() => of(false)),
    );
  }

  getEntity(): Observable<boolean> {
    return combineLatest([this._store.select(getActiveEntity), this._store.select(getActiveEntityLoaded)]).pipe(
      map(latest => {
        const [entity, loaded] = latest;
        if (!entity) {
          this._store.dispatch(new GetItemRequest());
        }

        return loaded;
      }),
      filter(loaded => loaded),
      take(1),
    );
  }
canActivate():可观察{
返回此.getEntity().pipe(
开关映射(()=>{
控制台日志(“加载pls”);
返回(真);
}),
catchError(()=>of(false)),
);
}
getEntity():可观察{
返回组合测试([this.\u store.select(getActiveEntity),this.\u store.select(getActiveEntityLoaded)]).pipe(
地图(最新=>{
常量[实体,已加载]=最新;
如果(!实体){
此._store.dispatch(new GetItemRequest());
}
返回装载;
}),
过滤器(已加载=>已加载),
以(1)为例,
);
}

(我意识到加载的布尔值
在这里是多余的,但不管怎样,我都不能让它工作)

在您请求(单击链接或有问题的导航)导航时是真的吗?什么是真的?(我把上面的代码粘贴得稍有错误,仍然有一个绝望的“return of(true)”在那里)正确-因此,如果你跟随路由器链接到它,那么它就解决了。如果应用程序直接硬加载到该路径,则不会。路由器不应该这样做,你知道吗?我遇到了类似的情况。当直接访问路由时,解析很好,但当重定向到路由时,它只是停留在一个布尔值返回true的循环中。事实并非如此,我们最终还是以稍微不同的方式完成了此操作,问题消失了。我在类似的事情上发现了各种各样的bug报告,我怀疑在那里的某个地方有bug,但是我们用不同的方式去做就不会触发它了。没什么帮助,对不起!