Маршрут к другой странице, основанной на охраннике в угловом 6, асинхронном запросе rxjx 6
Я реализовал функциональность, где я могу получить запрос и контролировать авторизацию страницы, я хочу перенаправить на страницу входа в случае ложного запроса.
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.authSer.isAuthenticated().pipe(map((response) => {
console.log('I ma here');
if (response.status === 200) {
return true;
} else {
console.log('Error getting data');
return false;
}
}), catchError((error) => of(false))
);
}
Как я могу проложить маршрут к странице входа отсюда? Я использую угловой 6
2 ответа
Я знаю, что в вопросе конкретно говорится о Angular 6, я просто хочу упомянуть, что с Angular 7.1 вы можете вернуть UrlTree или логическое значение из вашей охраны - а также Promise
а также Observable
эквиваленты -, и это будет служить автоматическим перенаправлением. Итак, в вашем случае:
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.authSer.isAuthenticated().pipe(
map((response) => {
console.log('I ma here');
if (response.status === 200) {
return true;
} else {
console.log('Error getting data');
return false;
}
}),
catchError((error) => of(false)),
map(responseOk => {
// Isolate dealing with true/false results since they can come from different opperators
if (!responseOk) {
return this.router.createUrlTree(['path', 'to', 'redirect'])
}
// alternatively, return a different UrlTree if you feel like it would be a good idea
return responseOk
})
);
}
Я также настоятельно рекомендую перейти на Angular 7, используя их руководство. Это довольно безболезненно и даст вам новые возможности, а также принесет множество исправлений.
Вот пример охраны с редиректом на URL. Может быть, это поможет:
export class AuthGuard implements CanActivate {
constructor(private router: Router, private authService: AuthenticationService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this.authService.isAuth) {
return true;
}
else {
this.router.navigate([state.url]); // or some other url
}
}}