#angular #angular7
#угловой #angular7
Вопрос:
Я ищу определение маршрута, которое должно соответствовать любому запросу, подобному ?p= some%random query
. Мое текущее определение маршрутов:
const routes: Routes = [
{ path: '', redirectTo: '/home', pathMatch: 'full' },
{ path: 'home', component: HomeComponent },
{ path: 'blog', component: BlogComponent },
{ path: 'blog/:title', component: BlogComponent },
{ path: '**', pathMatch: 'full', component: HomeComponent },];
Моя идея заключалась в том, чтобы получить параметр запроса p
с { path: '**', pathMatch: 'full', component: HomeComponent }
помощью и
ngOnInit() {
let id = this.route.snapshot.paramMap.get('p');
}
. Но, похоже, angular поддерживает запросы только со структурой /: a /:b. Например, запрос http://localhost:4200?p=yoyoyo будет преобразован в http://localhost:4200/yoyoyo . Тот же результат для http://localhost:4200/?p=/blog/Add Token
которого будет преобразован в http://localhost:4200/blog/Add Token
. Из-за этого я не могу восстановить значение параметра запроса p
. Как я могу создать маршрут, который будет работать для p=%
и как я могу восстановить значение p
?
Может ли это быть достигнуто путем перехвата процесса маршрутизации?
Ответ №1:
для меня единственное место, где это действительно сработало бы, — это сам домашний маршрут. «и «**» являются просто перенаправлениями на домашний компонент
const routes: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'home', component: HomeComponent },
{ path: 'blog', component: BlogComponent },
{ path: 'blog/:title', component: BlogComponent },
{ path: '**', pathMatch: 'full', redirectTo: 'home' },];
в homecomponent вам нужно подписаться, чтобы получать изменения
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.queryParams.subscribe(value => console.log(value) )
}
Комментарии:
1. Это то, чем я сейчас занимаюсь. Есть ли у вас решение для автоматического преобразования
http://localhost:4200/?p=/blog/Add Token
вhttp://localhost:4200/blog/Add Token
?2. Я протестировал это здесь, для меня это работает. Я попробовал
http://localhost:4200/nonexisting?p=value
, и он перенаправляет на «home» с доступными параметрами запроса. Я просто дважды проверил тот же маршрут, но ничегоhttp://localhost:4200/?p=value
не работает3. действительно убедитесь, что вы используете метод subscribe , форма let id = this.route.snapshot.paramMap.get(‘p’); не работает. Короче говоря: у меня нет этой проблемы с автоматическим преобразованием.
4. Я внес изменения в ответ, чтобы иметь точную копию моей конфигурации в соотношении 1: 1 для маршрутов, которые имеют значение. не могли бы вы, пожалуйста, попробовать с этим.
5. Что я имел в виду под преобразованием, так это то, что URL записывается с
http://localhost:4200/?p=value
на localhost:4200 / home . То же самое относится к,http://localhost:4200/blog/Add Token
который перенаправляет наhttp://localhost:4200/blog/Add Token
и удаляет параметр p. Для меня обратный вызов queryParams выводит только [object], который является пустым прототипом без дополнительной информации.
Ответ №2:
Для меня сработала следующая настройка.
Во-первых, мне пришлось удалить маршрут { path: '', redirectTo: '/home', pathMatch: 'full' },
.
Затем я создал следующий маршрут (и компонент PageNotFound) для обработки параметра p { path: ':p', component: PageNotFoundComponent },
.
В PageNotFoundComponent
мне удалось получить p
параметр с его значением. В зависимости от его значения я выбираю следующий маршрут.
ngOnInit() {
let id = this.route.snapshot.paramMap.get('p');
if (id == null) {
this.Link = "/home";
}
else {
this.Link = "/" this.route.snapshot.paramMap.get('p');
}
this.router.navigate([this.Link]);
}
Если кто-то перейдет на страницу, то http://localhost:4200/?p=/blog/Add Token
маршрут p
будет изменен, и запрос будет перенаправлен на компонент PageNotFound. В самом компоненте я решаю, что происходит дальше. Значение переменной id
было бы blog/Add Token
.
[ПРАВИТЬ] Я успешно использую это решение для обработки перенаправлений githubpage в сочетании с этим404.html страница и приложение angular.