#angular #guard
#угловой #охрана
Вопрос:
в моем приложении Angular, когда я перехожу к URL-адресу, содержащему параметры запроса, по защищенному маршруту canActivate, мой URL-адрес кодируется и, таким образом, не достигает нужного компонента. Пример:
Я копирую вставляю в браузер:
http://localhost:4200/orders?pickup=irvine-1-ca
он правильно возвращает true через эту защиту:
canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): | boolean | UrlTree | Promiselt;boolean | UrlTreegt; | Observablelt;boolean | UrlTreegt; { return this.authService.user.pipe( take(1), map(user =gt; { const isAuth = !!user; console.log("authGuard", user) if (isAuth) { return true; } return this.router.createUrlTree(['/account'], { queryParams: { mode: "login" } }); }) ); } }
Однако URL-адрес кодирует и перенаправляет следующее после передачи true:
http://localhost:4200/orders?pickup=irvine-1-ca
Как правильно сохранить параметры запроса? Спасибо за помощь! Заранее спасибо.
Редактировать:
Нашел довольно грубый обходной путь. На странице ошибки, вызванной маршрутизацией по закодированному маршруту, автоматически декодируйте маршрут и перейдите к правильно закодированной версии. Если у кого-нибудь есть более элегантное решение, я бы с удовольствием его выслушал.
export class ErrorPageComponent implements OnInit { constructor(private router: Router) { } ngOnInit() { // Fix for guard encoding URL with query params. Decoding the URL and redirecting to it if user lands on error page. const url = decodeURIComponent(this.router.url); if (url !== this.router.url) { this.router.navigateByUrl(url); } } }
Ответ №1:
Вы можете использовать decodeURIComponent()
decodeURIComponent('http://localhost:4200/orders?pickup=irvine-1-ca')
который должен вернуться:
'http://localhost:4200/orders?pickup=irvine-1-ca'
Комментарии:
1. Ну да, это просто, но как это связано с остановкой углового перенаправления на этот неправильно закодированный URL-адрес после прохождения через охрану?
2. Я не вижу, куда вы перенаправляете на данный URL-адрес с параметрами запроса, я вижу только дерево createUrl. Я бы сказал, чтобы завернуть URL-адрес или передать декодировочный компонент перед перенаправлением. Если вы хотите передать параметры запроса обратно через службу или что-то еще, вы также можете подписаться на параметры запроса на маршруте.
3. @Ghot, спасибо за это. Я нашел довольно грубый обходной путь, используя это, отредактированное в моем вопросе выше.