#angular #typescript
#angular #typescript
Вопрос:
Я использую Angular 7 с Type script.
Мне нужно иметь возможность перейти к компоненту с queryString на новой вкладке
в настоящее время я использую что-то вроде этого
const url = myBaseUrl ‘?param1= 123amp; param2= 321’ window.open(URL, ‘_blank’);
и это приводит к переходу на правильную страницу, но при загрузке строка запроса была очищена, поэтому она выглядит следующим образом myBaseUrl/0%3param1=123amp;param2=321
что прерывает весь процесс.
Есть ли способ запретить Angular изменять URL-адрес?
Ответ №1:
const url = this.router.serializeUrl(this.router.createUrlTree([myBaseUrl '/0'], {
queryParams: {
params1: "123",
params2:"321"
}
}))
const newTab = window.open(url, '_blank');
if(newTab) {
newTab.opener = null;
}
Комментарии:
1. Пожалуйста, добавьте еще несколько деталей, объясняющих ваш код.
Ответ №2:
вам нужно предоставить ее отдельно, как показано ниже:
this.router.navigate([myBaseUrl ''], { queryParams: { 'param1': 123, 'param2': 321 } });
Комментарии:
1. Привет, Нирадж, это здорово, но если я это сделаю, откроется ссылка на той же вкладке. Мне нужно, чтобы это было на новой вкладке
Ответ №3:
Здесь вы можете сделать, как показано ниже:
this.router.navigate([myBaseUrl ''], { queryParams: { 'param1': 123, 'param2': 321 } }).then(result => { window.open(link, '_blank'); });
Комментарии:
1. Что
означает?
2. @DongBinKim это было для URL, упомянутого в вопросе, который является простым символом 🙂
3. Я вижу. На самом деле, я попробовал ваш ответ, но откуда взялся
link
? Я имею в виду, в моем тесте и моем мышлении, независимо от того, что вы предоставляете в функции навигации по маршрутизатору, разве они не прошлиwindow.open
?
Ответ №4:
Для любого, кто столкнулся с подобной проблемой, вот как я исправил свою проблему.
Проблема оказалась вызвана тем, что наша аутентификация перехватила вызов URL и проверила токен доступа. Затем, когда URL-адрес был передан обратно в angular, он содержал id_token. URL был перехвачен снова, токен был удален, а затем используйте angular router для маршрутизации всего URL.
this.router.navigate([entireUrl]);
Это то, что вызвало изменение строк запроса.
Я должен был проверить URL на наличие? чтобы указать, что в нем была строка запроса, отделите ее от основного URL-адреса, преобразуйте строку запроса в объект и используйте маршрутизатор для навигации с правильно добавленными параметрами запроса
if (url.includes('?')) {
let baseRoute: string = url;
const splitRoute = baseRoute.split('?');
baseRoute = splitRoute[0];
const paramsObj = this.getRouteParamsObject(splitRoute[1]);
this.router.navigate([baseRoute], {queryParams: paramsObj});
} else {
this.router.navigate([url]);
}
private getRouteParamsObject(paramString: string): any {
const pairs = paramString.split('amp;');
const result = {};
pairs.forEach((pair: any) => {
pair = pair.split('=');
result[pair[0]] = decodeURIComponent(pair[1] || '');
});
return JSON.parse(JSON.stringify(result));
}
Я надеюсь, что это вам тоже поможет.
Большое спасибо Niraj за его помощь
Комментарии:
1. Как это позволяет вам открывать новую вкладку с сохранением строки запроса?