Получить текущий маршрут без параметров
Мне нужно получить мой текущий маршрут без параметров в Angular 2, я нашел способ получить текущий маршрут с параметрами следующим образом:
this.router.url
а затем разделить его:
this.router.url.split(';')[0]
Но это выглядит как обходной путь, я думаю, что должно быть лучше?
Ответы
Ответ 1
parseTree
от Router
помогает parseTree
сегменты без каких-либо знаний о структуре URL.
import { Router } from '@angular/router';
...
constructor(private router: Router) {}
...
const urlTree = this.router.parseUrl(url);
const urlWithoutParams = urlTree.root.children['primary'].segments.map(it => it.path).join('/');
Начните отсюда. Если у вас есть вторичные выходы, отрегулируйте по мере необходимости.
Ответ 2
это может помочь вам:
-
Импортный маршрутизатор:
import { Router } from '@angular/router';
-
Подпись в конструкторе:
constructor(private _router: Router) {}
-
Проверьте свойство событий _router:
this._router.events
.subscribe(
(url:any) => {
let _ruta = "";
url.url.split("/").forEach(element => {
if(element!=="" && _ruta==="")
_ruta="/"+element;
});
console.log("route: "+_ruta); //<<<---- Root path
console.log("to URL:"+url.url); //<<<---- Destination URL
console.log("from URL:"+this._router.url);//<<<---- Current URL
});
Ответ 3
Чтобы получить текущий маршрут без параметров запроса, вы можете использовать следующую строку:
this.router.url.split('?')[0]
Ответ 4
В моем случае мне нужно было сравнить предыдущий маршрут и новый маршрут при изменении только : id на url через router.navigate. Поскольку мне нужен путь без разных идентификаторов, я получил исходный маршрут маршрута:
/*
Routes = [
{ path: 'main/details/:id', component: DetailComponent }
]
previousRoute = '/main/details/1'
newRoute = '/main/details/2'
*/
this.routeSubscription = this.router.events.filter((event) => event instanceof ResolveStart)
.pairwise() // returns previous and current events
.subscribe((ev: [ResolveStart, ResolveStart]) => {
let sameRoute = ev[0].state.root.firstChild.routeConfig.path == ev[1].state.root.firstChild.routeConfig.path ?
ev[0].state.root.firstChild.routeConfig.path : undefiend;
if (sameRoute) {
// Same routes, probably different ids
console.log(sameRoute) // gives 'main/details/:id'
} else {
// Different routes
}
});
Ответ 5
Я использую locationStrategy, как в ответе accept, но с .split()
. LocationStrategy отлично работает в Angular 4 & Angular 5;
import {LocationStrategy} from '@angular/common';
export class MyService {
constructor(private locationStrategy: LocationStrategy) {
}
public getUrl(filters: FilterConfig[]): void {
const url = this.locationStrategy.path();
const urlArray = url.split('?');
return urlArray[0];
}
}
Еще одна вещь, которую вы должны выполнить, - это убедиться, что ваш <router-outlet>
правильно инициализирован, прежде чем попытаться получить locationStrategy.path()
. Если <router-outlet>
не инициализируется, никакие Угловые службы не могут правильно возвращать URL и параметры запроса.
Чтобы убедиться, что стратегия местоположения вы инициализирована, вы можете использовать метод подписки, например:
this.router.events.subscribe((evt) => {
...
}
Но в этом случае вы запускаете свою функцию при каждом изменении маршрутизатора, поэтому вам нужно защитить этот случай, если он нежелателен.
Ответ 6
Ни один из них не работал для меня.
Есть много подходов к этому, но в этом случае охранник был на месте, чтобы остановить пользователей, отправляющихся на определенные URL-адреса. Это работало отлично, за исключением того, что URL имел параметры, поскольку переданный URL всегда содержал все параметры.
EG: myPage/param1/param2
Или: myPage?param1=1¶m2=2
В этом случае я бы хотел просто myPage
.
Я закодировал ниже, мне это не нравится, я уверен, что он может быть улучшен, но пока не нашел ничего, что работает до сих пор:
let url: string = state.url;
let urlParams: string[];
if (url.includes("?")) {
url = url.substr(0, url.indexOf('?'));
} else {
urlParams = route.url.toString().split(';')[0].split(',');
if (urlParams.length > 1) {
urlParams.shift(); // Remove first element which is page name
// Get entire splitting on each param
let fullUrlSegments: string[] = state.url.split('/');
// Remove number of params from full URL
fullUrlSegments = fullUrlSegments.slice(0, fullUrlSegments.length - urlParams.length);
url = fullUrlSegments.join('/');
}
}
alert(url);
state.url
происходит от реализации CanActivate
(или вводит Router
).
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) Observable<boolean> { ... }
Ответ 7
У меня было похожее требование, в зависимости от того, какой маршрут я использовал, чтобы получить компонент, который хотел получить разные результаты.
Я обнаружил, что activatedRoute.routeConfig.path
был отличным вариантом, и мне было легко увидеть, какой маршрут был использован.
constructor(private activatedRoute: ActivatedRoute) {}
ngOnInit() {
if (this.route.routeConfig.path === 'heroes/:id')
Ответ 8
Собственный javascript будет работать, чтобы разделить URL на логические части. Проверьте объект "location" (или window.location). Например, использование местоположения по URL- адресу https://example.com/pathname1/pathname2?queryParam1=1&queryParam2=2 приводит к
location.origin === 'https://example.com/pathname1/pathname2'
location.href === 'https://example.com/pathname1/pathname2?queryParam1=1&queryParam2=2'
location.pathname === '/pathname1/pathname2'
location.search === '?queryParam1=1&queryParam2=2'
Ответ 9
более короткий синтаксис состоит в том, чтобы использовать класс LocationStrategy из @углового/общего для представления и чтения состояния маршрута непосредственно из URL-адреса браузера, который более удобен, чем this.router.url при попытке получить URL-адрес маршрутизатора в случае углового приложения с несколькими модули.
import {LocationStrategy} from '@angular/common';
export class MyComponent implements OnInit {
constructor(private url:LocationStrategy) { }
ngOnInit() {
//this will log the current url
console.log(this.url.path());
}
}
используйте затем .split('?')
чтобы получить конечный результат.