我有一个 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 循环到达时,它使整个状态未定义。