dans certains de mes angular gardes de route, je veux configurer le chemin "suivant", pour rediriger vers après une connexion réussie.
Ainsi, la signature de la fonction oridinary guard canActivate
ressemble à ceci:
public canActivate(route: ActivatedRouteSnapshot): Observable<boolean> | boolean {
// ...blah
return true;
}
Le paramètre route
est une instance d'ActivatedRouteSnapshot.
Auparavant, pour obtenir l'URL "suivante", je venais de l'obtenir à partir du route.url
. Cela fonctionne très bien, tant qu'il n'y a pas de parcours enfants.
Mon exemple d'URL est /search/advanced?query_hash=1221d3b57f5616ee16ce70fdc78907ab
, où advanced
est une route enfant d'un search
.
Les itinéraires enfants se trouvent dans route.children
, mais itérer sur ces enfants (en particulier il peut y avoir plusieurs niveaux) et combiner l'URL de cette façon semble maladroit et laid.
Ce qui m'intéresse est contenu dans route._routerState.url
propriété (étant une chaîne, en bas de l'image ci-dessous), mais c'est une variable "privée".
Suis-je en train de manquer quelque chose? Comment peut-on obtenir avec élégance l'url complète (avec les chemins enfants) du ActivatedRouteSnapshot
? Angular est 5.1.
essayez ceci pour l'obtenir à partir de RouterStateSnapshot
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
console.log(state.url)
...
Il n'y a pas de fonction prête à l'emploi de Angular pour y parvenir, alors je les ai écrit:
function getResolvedUrl(route: ActivatedRouteSnapshot): string {
return route.pathFromRoot
.map(v => v.url.map(segment => segment.toString()).join('/'))
.join('/');
}
function getConfiguredUrl(route: ActivatedRouteSnapshot): string {
return '/' + route.pathFromRoot
.filter(v => v.routeConfig)
.map(v => v.routeConfig!.path)
.join('/');
}
Exemple de sortie lorsque route
provient de ProjectComponent
:
const routes: Routes = [
{
path: 'project', component: ProjectListComponent, children: [
{path: ':id', component: ProjectComponent}
]
},
];
getResolvedUrl(route) => /project/id1
getConfiguredUrl(route) => /project/:id