Je dois obtenir mon itinéraire actuel sans paramètres dans Angular 2, j'ai trouvé un moyen d'obtenir l'itinéraire actuel avec paramètres comme suit:
this.router.url
et ensuite le scinder:
this.router.url.split(';')[0]
Mais cela ressemble à une solution de contournement, je pense qu'il devrait y avoir une meilleure façon?
parseTree
à partir de Router
permet d'extraire les segments sans aucune connaissance de la structure des 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('/');
Commencez d'ici. Si vous avez des prises secondaires, ajustez-les au besoin.
cela pourrait vous aider:
Importation Routeur:
import { Router } from '@angular/router';
Signature dans le constructeur:
constructor(private _router: Router) {}
Vérifier la _routeur propriété des événements:
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
});
J'utilise locationStrategy comme dans accept answer mais avec la méthode .split()
. LocationStratégie fonctionne parfaitement dans 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];
}
}
Une autre chose à faire est de s’assurer que votre <router-outlet>
est correctement initialisé avant d’essayer d’obtenir locationStrategy.path()
. Si <router-outlet>
n'est pas initialisé, aucun service angulaire ne peut renvoyer correctement l'URL et les paramètres de requête.
Pour être sûr que votre stratégie de localisation est initialisée, vous pouvez utiliser la méthode subscribe comme:
this.router.events.subscribe((evt) => {
...
}
Mais dans ce cas, vous déclenchez votre fonction à chaque changement de routeur, vous devez donc protéger cette casse si elle n’est pas souhaitée.
Dans mon cas, je devais comparer l'itinéraire précédent et le nouvel itinéraire lorsque je ne modifiais que le: id de l'URL via router.navigate . Puisque je voulais le chemin sans les différents identifiants, j'ai obtenu le chemin d'origine de la route:
/*
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
}
});
Aucun de ceux-ci n'a fonctionné pour moi.
Il existe de nombreuses approches à cet égard, mais dans ce cas, une protection était en place pour empêcher les utilisateurs d'accéder à des URL spécifiques. Cela fonctionnait bien sauf lorsque les URL avaient des paramètres, car l'URL transmise contenait toujours tous les paramètres.
E.G: myPage/param1/param2
Ou: myPage?param1=1¶m2=2
Dans ce cas, je voudrais justemyPage
.
J'ai codé le code ci-dessous, je ne l'aime pas, je suis sûr que cela peut être amélioré, mais je n'ai rien trouvé qui fonctionne jusqu'ici:
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
provient de l'implémentation de CanActivate
(ou injecter Router
).
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) Observable<boolean> { ... }
Pour obtenir l'itinéraire actuel sans paramètres de requête, vous pouvez utiliser la ligne unique mentionnée ci-dessous . This.router.url.split ('?') [0]