2

我有这个路由守卫,它应该检查用户的角色以及roleAccess路由定义中定义的属性。

我面临的问题是.map不管 是否都执行,只有当它是错误的accounts.isSelfPending(它从 开始)才允许运行。null@ngrx/store.map

我怎样才能做到这一点?

编辑:我意识到我的问题可能有点含糊,我需要等待来自/self组件层次结构更高层的请求中的用户信息,并存储在商店中。

现在的问题是,/self尽管在 my 中触发了请求,但该请求甚至没有被触发,而 myDashboardComponent又将其AdsComponent作为路由中的子节点之一。(这是我目前试图用这个守卫锁定的路线)。

为什么它甚至不触发/self请求?我认为这是这个问题的一部分。

return this.store.select('accounts')
  .let((state: Observable<IAccountsStorage>) => state.filter((accounts: IAccountsStorage) => accounts.isSelfPending !== null && accounts.isSelfPending === false)))
  .map((accounts: IAccountsStorage) => {

    this.route.data.subscribe(
      data => {

        if (accounts.self) {

          if (accounts.self.role !== data['roleAccess'] && (data['roleAccess'] !== 0 || data['roleAccess'] !== undefined || data['roleAccess'] !== null)) {
            return this.router.navigateByUrl('admin/dashboard');
          }
          else {
            return true;
          }
        }
      }
    );
  }
).first();
4

2 回答 2

1

我知道那是一年之后的事了,但我在 Angular 中的 Stores 和 Guards 也遇到了类似的问题。我认为您的问题与 State 最初有一个NULL用户对象有关——即使只是在您从现有令牌设置用户时很短暂。

NULL首先出现,但需要过滤掉,如下所示:

canLoad(route: Route): Observable<boolean> | Promise<bolean> | boolean {
    return this.store.select(fromRoot.getUser)
        .filter(user => user != null) // ** THIS IS THE KEY TO SKIP NULL USER **
        .map(user => {
            //code t check user role
        }).take(1); // or .first() -- doesn't seem to be necessary for canActivate guards
}

注意:上面的代码反映了 Store 代码的当前编写方式——或者,至少,它是按照当前ngrx/store4.x代码示例的编写方式设计的,这与原始问题中使用的结构不同。

于 2018-02-21T05:00:56.273 回答
0

在意识到使用 store 作为中间人会造成太多问题后,我决定直接调用 api,最终得到一个更清晰的守卫,实际上可以按预期工作。

我认为这可能对其他人有帮助,所以我将在此处留下最终解决方案:

canLoad(): Observable<boolean> {

  return this.accountsApi.getSelf()
    .map(res => {

      if (res.data.role === 1) {
        return true;
      }
      else {
        return this.router.navigate(['admin/dashboard']);
      }
    })
    .catch(err => {
      return this.router.navigate(['admin/dashboard']);
  });
}

但是,如果有人知道如何使用原始代码解决问题,请提供它,因为我很好奇如何使用商店实际执行此操作。

于 2017-01-26T11:07:21.823 回答