Как вернуть Observable <логическое значение> в canActivate на охраняемом маршруте в Угловое 6

голоса
0

Я хотел бы, чтобы охранять маршрут с классом CanActivate. Документация Я прочитал всегда имеет canActivateметод , возвращающий логическое значение, но я думаю , что нужно возвращать либо Наблюдаемые или Promise.

Мое приложение имеет хранилище данных со свойством , userчто является Observable<User>.

Когда приложение загружает, user.role это undefined. После первоначального запроса HTTP, то user.role становится либо «пользователь» или «гость». Итак, мне нужен метод canActivate подождать , пока user.role не установлен либо «пользователь» или «гостя», а затем ответить. Вот что у меня сейчас:

  canActivate(): Observable<boolean> {
    return new Observable((observer: Observer<boolean>): void => {
      this.state.user.subscribe((user: User) => {
        if (user.role === 'user') {
          observer.next(true);
        } else if (user.role === 'guest') {
          observer.next(false);
          this.router.navigate(['/login']);
        }
        // user is not set, wait for next value
      });
    });
  }

Проблема, которую я считаю, что подписка продолжает идти, и мой маршрутизатор иногда неожиданно перенаправлен при state.user обновляется. Как я могу это исправить. Или есть лучший способ сделать это?

Задан 19/09/2018 в 13:21
источник пользователем
На других языках...                            


2 ответов

голоса
0

Вы можете попробовать этот кусок кода

canActivate(): Observable<boolean> {
    return this.state.user.map((user: User) => {
        if (user.role === 'user') {
          return true;
        } else if (user.role === 'guest') {
          this.router.navigate(['/login']);
          return false;
        }
        // user is not set, wait for next value
      });
  }
Ответил 19/09/2018 d 13:59
источник пользователем

голоса
0

Почему вы хотите , чтобы повесить это наблюдаемым , если user.roleесть undefined? Таким образом , весь маршрутизатор висит. Это может привести к непредсказуемому поведению , как нежелательная переадресация.

Я думаю , вы не должны повесить этот canActivate()метод , но вернуть trueили falseкак можно быстрее в асинхронном способом.

Я не знаю контекст проблемы. Если вы хотите , чтобы убедиться , что пользователь авторизован перед запуском приложения может быть лучше использовать APP_INITIALIZER? Этот механизм будет «висеть» все приложение , пока некоторые важные вещи не делаются и решить Promise.

Ответил 19/09/2018 d 13:55
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more