Пожалуйста, посмотрите пример ниже
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from '@angular/router';
import {Observable, of} from 'rxjs';
import {Injectable} from '@angular/core';
import {AuthService} from './auth.service';
import {map, take} from 'rxjs/operators';
@Injectable({providedIn: 'root'})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService,
private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | Observable<boolean | UrlTree> | boolean {
return this.authService.user.pipe(
take(1),
map(user => {
if (!!user) {
return true;
}
return this.router.createUrlTree(['/auth']);
}));
}
}
user
имеет тип BehaviorSubject
, и он определяет статус авторизации пользователя, то есть если он равен объекту, то пользователь залогинен, а не иначе. Поэтому охранник активирует маршрут /auth
, если пользователь вошел в систему, и перенаправляет нас в противном случае. Теперь, что произойдет, если я удалю take(1)
из конвейера, чтобы в результате мы не отписались?