У меня есть приложение Angular7, и я выбираю отображение кнопки в app.component на основе логического значения, которое определяется как:
get superUser(): boolean {
return this.auth.userPermissions.SUPER_USER;
}
Теперь в моей службе аутентификации у меня инициализируются userPermissions послемодель разрешений со всеми разрешениями, помеченными как «ложные».
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;
}
При проверке подлинности массив разрешений отправляется редуктору, а разрешения устанавливаются с помощью хранилища 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
Ссылка на строку, где я определил геттер.
Но он определен везде.В моем коде нет места, которое я не инициализировал и не определил переменную модели со значением 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);
Itкажется, что я забыл обновить модель с разрешениями, которые были в этом массиве, и когда цикл for достиг этого, он сделал все состояние неопределенным.