Я пытаюсь условно перенаправить маршрут angular 2 на внешний URL-адрес, включая параметры строки запроса.
Т.е. пользователь щелкнет ссылку в раскрывающемся списке кнопок профиля пользователя, и если сервер ранее указал, что они принадлежат определенной компании, он будет ссылаться на внешнюю страницу, в противном случае эта же кнопка будет проходить через обычные системы маршрутизации одностраничных приложений angular.
Мой текущий подход включает подписку на событие начала навигации и изменение href расположения окна, чтобы оно указывало на внешний веб-сайт.
Я сталкиваюсь с двумя разными проблемами в зависимости от того, как я подхожу к этой задаче.
1.
Если строка запроса передается вместе с путем routerLink, строки запроса экранируются перед передачей на удаленный веб-сайт.
Если я исправлю это в подписке, кнопка возврата в браузере все равно вернется к неисправленному URL-адресу.
Например, следующий код
в шаблоне html.
<a [routerLink]="['/profile?id=1']" > profile </a>
и в app.component
this.router.events.subscribe((event) => {
if (event instanceof NavigationStart) {
if(conditional logic here){
let url: string = "http://example.com" + event.url
window.location.href = url;
}
}
}
приводит к URL http://example.com/profile%3Fid%3D1
Если я заменяю escape-символы в своей подписке, они становятся http://example.com/profile?id=1, однако кнопка возврата браузера переходит на неработающий URL-адрес и загружает страницу с ошибкой.
2.
Из-за вышеуказанных ошибок я попытался передать строку запроса через параметр give в ссылке на маршрутизатор, как описано в следующем вопросе SO.
Как обрабатывать параметры запроса в angular 2
ссылка на новый маршрутизатор выглядит так
профиль
и приводит к URL-адресу, подобному следующему http://example.com?0=%3F&1=i&2=d&3=%3D&4=1
Похоже, что это использует дочернюю маршрутизацию и, следовательно, параметры матрицы, как указано в сообщении so.
Я не уверен, почему это так, поскольку мой routing.ts прост и не содержит дочерних элементов.
const routes: Routes = [
{path: '**', component: RouteComponent}];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [ RouterModule ]
})
export class RoutingModule { }
Кроме того, кажется, что все еще избегает специальных символов
Мой первый вопрос: есть ли официальный или лучший способ перенаправить угловую маршрутизацию на внешние веб-сайты (включая параметры строки запроса)
Если нет, я был бы признателен за любые идеи о том, как
а. запретить angular экранировать параметры строки запроса
б. не позволять кнопке "Назад" распознавать URL-адрес до того, как я заменю экранированные символы. (что-то вроде отмены события начала навигации)
c. запретить angular преобразовывать параметры в параметры матрицы.
Спасибо за любую помощь, которую вы можете оказать