J'ai la configuration de route suivante dans mon projet Angular:
this.router.config //outputs the above array
Je peux maintenant obtenir ma configuration de route comme ceci:
export const routes: Routes = [
{ path: 'a/:id', loadChildren: './a/a.module#AModule', data: {a: a}},
{ path: 'b/:id', loadChildren: './b/b.module#BModule', data: {a: b}}
];
Le this.router.url affiche a , mais comment identifier correctement le bon Route puisque la configuration a le chemin non résolu et que le routeur tient le chemin résolu.
La raison pour laquelle je veux faire cela est d'accéder aux données dans le app.component où mon router-outlet est et non dans le composant lui-même (la documentation angulaire indique que l'objet data n'est accessible qu'au composant de route lui-même.
6 Réponses :
vous pouvez utiliser la sortie d'activation de la sortie du routeur dans le composant de votre application
onActivate(event : any) {
console.log(event);
}
il vous donne le composant laoded
dans votre app.component.ts p >
<router-outlet (activate)="onActivate($event)"></router-outlet>
Je veux juste accéder aux données et non à l'ensemble du composant. Je n'ai pas besoin d'accéder au composant.
Je résoudrais ce problème en divisant la route de chargement différé pour la simplifier. Routage racine:
export const bModuleRoutes: Routes = [
{ path: 'item/:id', component: YourComponent, data: {a: b}}
];
Routage module A:
export const aModuleRoutes: Routes = [
{ path: 'item/:id', component: YourComponent, data: {a: a}}
];
Routage module B:
export const routes: Routes = [
{ path: 'a', loadChildren: './a/a.module#AModule'},
{ path: 'b', loadChildren: './b/b.module#BModule'}
];
Ici, vous avez un itinéraire individuel pour chaque module et vous pouvez jouer avec l'itinéraire individuel du module. Bon codage
Je ne sais pas comment cela m'aiderait à accéder aux données ? De plus, j'aimerais garder le chargement paresseux.
Je l'ai résolu en utilisant ce code:
this.router.events.subscribe(event => {
if (event instanceof RoutesRecognized) {
console.log(event.state.root.firstChild.data['a']);
}
});
IMO pour obtenir routeConfig, vous avez besoin de l'événement ActivationEnd des événements du routeur. J'ai recherché le paramètre dans le chemin pour le comparer de cette manière:
this.router.events.subscribe((event: any) => {
if (event instanceof ActivationEnd) {
const segmentArr = event.snapshot.routeConfig.path.split('/'); // there will be what you need
const lastSegment = segmentArr.pop();
// if the segment is not a param
if (lastSegment.includes(':')) {
// this is ":someparam" segment
}
}
});
Vous pouvez utiliser Router.state pour obtenir la configuration d'origine de Route .
Le routeur angulaire représente la route actuelle sous forme d'arborescence de routes hiérarchique due aux enfants code>, vous devez donc le parcourir pour obtenir l'enfant le plus profond qui est généralement ce que vous recherchez.
Peut être fait de la manière suivante:
let currentRoute = this.router.routerState.root;
while (currentRoute.firstChild) {
currentRoute = currentRoute.firstChild;
}
console.log(currentRoute.routeConfig); // returns `Route` object
Pour réagir aux changements, cela doit être dans this.router.events.subscribe(...).
Cette configuration est accessible sans événement, à partir de la racine onInit par exemple (mais peut également être utilisée dans le corps de l'abonnement):
RouterModule.forRoot([
{
path: 'login',
component: WelcomePageComponent,
data: {
hideHeader: true,
},
},
{
path: '',
canActivateChild: [AuthGuard, ACLGuard],
children: [
{
path: '',
redirectTo: 'wizard',
pathMatch: 'full',
},
{
path: 'wizard',
data: {
hideHeader: true,
},
},
],
},
],
La vérification de la longueur des enfants est pour la configuration à deux niveaux :
const config = !!this.activatedRoute.snapshot.root.firstChild.children.length
? this.activatedRoute.snapshot.root.firstChild.firstChild.data
: this.activatedRoute.snapshot.root.firstChild.data;
this.hideHeader = config['hideHeader'] ?? false;