Angular 2 Маршрут к неугловому URL-адресу, включая параметры строки запроса

Я пытаюсь условно перенаправить маршрут 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 преобразовывать параметры в параметры матрицы.

Спасибо за любую помощь, которую вы можете оказать


person Elliot Rieflin    schedule 20.03.2017    source источник
comment
Мне удалось решить эту проблему функционально, добавив инструкцию skipLocationChange в ссылку маршрутизатора. Мне все еще кажется, что это неуклюжее решение, поэтому я все равно буду признателен за предложения   -  person Elliot Rieflin    schedule 21.03.2017