Как мне перенаправить на другую домашнюю страницу, когда пользователь вошел в систему Angular? - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь сделать перенаправление на страницу /dashboard всякий раз, когда пользователь вошел в систему. Целевая страница по умолчанию - /home, но домашняя страница вошедшего пользователя - /dashboard.

У меня есть класс обслуживания пользователя, в котором я создаю sharedUser, и это BehaviorSubject:

  public sharedUser= new BehaviorSubject<User>(null);

И затем у меня есть метод initUser, в котором я задаю значения объекту пользователя. Метод initUserStatus() является Observable и заполняет данные из запроса.

private initUser(accessToken: string): void {
    const tokenData = TokenUtil.decodeToken(accessToken);

    this.user.email = tokenData.email;
    this.initUserStatus().subscribe(
      () => this.sharedUser.next(this.user)
    );
  }

И затем у меня есть класс Guard, в котором я пытаюсь перенаправить, если данные пользователя заполнены и фактически вошли в систему: пользователь входит в систему, когда электронная почта initalized, метод isLoggedIn() проверяет, есть ли электронная почта.

export class HomePageGuard implements CanActivate {

  constructor(private userService: UserService, private router: Router) { }

  public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<UrlTree | boolean>  {
    return this.userService.sharedUser.asObservable().pipe(
      map(() => {
        if (this.userService.isLoggedIn()) {
          return this.router.createUrlTree(['/dashboard']);
        }
        return true;
      }
    ));
  }
}

Кажется, что canActivate будет в бесконечном l oop, и он не будет go завершен, и поэтому он будет не перенаправлять на страницу / дашборд.

Как я могу это исправить? Или что мне не хватает?

1 Ответ

1 голос
/ 02 августа 2020

Наблюдаемое, возвращенное стражником, не должно завершаться. Angular в любом случае будет использовать оператор first() .

const canActivateObservables = canActivate.map((c: any) => {
    return defer(() => {
      const guard = getToken(c, futureARS, moduleInjector);
      let observable;
      if (isCanActivate(guard)) {
        observable = wrapIntoObservable(guard.canActivate(futureARS, futureRSS));
      } else if (isFunction<CanActivateFn>(guard)) {
        observable = wrapIntoObservable(guard(futureARS, futureRSS));
      } else {
        throw new Error('Invalid CanActivate guard');
      }
      return observable.pipe(first()); // 
    });
  });

Чтобы избежать бесконечного l oop, вы можете проверить свою охрану, если URL , к которому вы собираетесь перейти, содержит путь /dashboard. В этом случае вам не следует планировать новую навигацию и вместо этого возвращать true.

 map(() => {
  
  // or 
  // this.userService.isLoggedIn() && !route.url.some(({ path }) => path === 'dashboard')
  if (this.userService.isLoggedIn() && !state.url.includes('dashboard')) {
    return this.router.createUrlTree(['/dashboard']);
  }
  return true;
}
...