2

我有一个 Angular7 应用程序,我选择在 app.component 中显示一个基于布尔值的按钮,该布尔值定义为:

get superUser(): boolean {
    return this.auth.userPermissions.SUPER_USER;
  }

现在在我的身份验证服务中,我在权限模型之后初始化了 userPermissions,所有权限都标记为“false”。

permissions: Permissions = {
    SUPER_USER: false,
    CLIENT_ADMIN: true,
    ADD_CLIENT: false,
    ADD_USER: false,
    DELETE_CLIENT: false,
    DELETE_USER: false,
    READ_ALL_CLIENTS: false,
    READ_ALL_USERS: false,
    READ_REPORTS: false,
    READ_USERS: false,
    UPDATE_CLIENT: false
  };

  public get userPermissions(): Permissions {
    return this.permissions;
  }

在 Authentication 上,权限数组被发送到 reducer,并且正在使用 ngrx 存储设置权限。

.subscribe((token: string) => {
            Cookie.set('access_token', token);
            this.store.dispatch(new UserActions.SetUser(this.currentUser));
            const currentUser = this.helper.decodeToken(token);
            this.store.dispatch(
              new PermissionsActions.SetPermissions(currentUser.permissions)
            );
            return this.router.navigate(['']);
          });

在服务中,我订阅了该存储值并更新了权限对象。

    this.permissionSubscription = this.store
      .select('permissions')
      .subscribe(permissions => {
        this.permissions = permissions;
      });

现在的问题是,身份验证后第一次整个事情崩溃返回:

Cannot read property 'SUPER_USER' of undefined

引用我定义 getter 的行。

但它在任何地方都有定义。我的代码中没有一个地方我没有初始化并使用“false”默认值定义模型变量。

在我处理权限数组的减速器中:

  const keys: string[] = Object.keys(state);

  for (const permission of action.permissions) {
    if (keys.includes(permission.name)) {
      state[permission.name] = true;
    } else {
      return console.log('ELSE BLOCK FIRING');
    }
  }

  return tassign(state);

似乎我忘记使用该数组中的权限更新模型,当 for 循环到达时,它使整个状态未定义。

4

1 回答 1

0

最终变成了化简器的恶作剧,其中一个函数试图用一个不存在的属性做某事,每次都搞乱整个对象 onInit。

于 2019-07-10T14:34:42.543 回答