Public get возвращает логическое разрешение от службы аутентификации, которое инициализируется как false и изменяется, когда хранилище NGRX возвращает значение, но НЕ УКАЗАНО - PullRequest
2 голосов
/ 28 марта 2019

У меня есть приложение 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 достиг этого, он сделал все состояние неопределенным.

1 Ответ

0 голосов
/ 10 июля 2019

Закончилось махинациями, когда функция пыталась что-то сделать с несуществующим свойством, каждый раз портя весь объект onInit.

...