J'ai mis en place des itinéraires comme ci-dessous
const appRoutes: Routes = [
{
path: 'login',
component: LoginComponent,
data: {
title: 'Login TTX'
}
},
{
path: 'list',
component: ListingComponent,
data: {
title: ' TTX Home Page',
module:'list'
}
},
{
path: '',
redirectTo: '/login',
pathMatch: 'full'
},
];
maintenant, quand je viens à '/list'
route puis sur 'listing.component.ts'
j'ai écrit ci-dessous le code
export class ListingComponent {
public constructor(private router:Router) {
//here how i can get **data** of **list** routes
}
}
public constructor(private route:ActivatedRoute, private router:Router) {
console.log(route.snapshot.data['title']);
}
Pour Angular 4+
Si vous placez le code suivant dans les composants de niveau parent ou supérieur tel que AppComponent
, cela ne fonctionnera pas. Il ne fonctionne que sur les composants enfants ou de niveau inférieur pour lesquels vous avez défini les données personnalisées de l'itinéraire:
public constructor(private route:ActivatedRoute, private router:Router) {
console.log(route.snapshot.data['title']);
}
Ainsi, si vous souhaitez accéder aux données personnalisées de routage globalement à partir d'un composant parent ou supérieur pour accéder au changement des données personnalisées de routage, vous devez écouter les événements de routeur, en particulier les événements RoutesRecognized
ou NavigationEnd
. Je vais montrer deux procédures avec AppComponent
avec deux événements:
Première approche:
export class AppComponent implements OnInit, AfterViewInit {
constructor(private activatedRoute: ActivatedRoute, private router: Router) { }
ngOnInit() {
this.router
.events
.filter(event => event instanceof NavigationEnd)
.map(() => {
let child = this.activatedRoute.firstChild;
while (child) {
if (child.firstChild) {
child = child.firstChild;
} else if (child.snapshot.data && child.snapshot.data['custom_data']) {
return child.snapshot.data['custom_data'];
} else {
return null;
}
}
return null;
}).subscribe( (customData: any) => {
console.log(customData);
});
}
}
Deuxième approche utilise:
this.router.events
.filter(event => event instanceof RoutesRecognized)
.map( (event: RoutesRecognized) => {
return event.state.root.firstChild.data['custom_data'];
})
.subscribe(customData => {
console.log(customData);
});
Remarque: Même si le dernier est plus court et fonctionne normalement, mais, si vous avez des routes imbriquées, il est conseillé d'utiliser le premier.
son travail pour les composants qui ne naviguent pas (comme en-tête):
this.route.root.firstChild.snapshot.data['title']
et complate exemple:
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router, NavigationEnd } from '@angular/router';
export class HeaderComponent implements OnInit {
title: string;
constructor(private route: ActivatedRoute, private router: Router ) { }
ngOnInit() {
this.router.events.subscribe(event => {
if(event instanceof NavigationEnd) {
this.title = this.route.root.firstChild.snapshot.data['title']
}
});
}
}
cerdit à cette answare
Après avoir testé diverses solutions, la réponse du groupe d’appui angulaire a en réalité résolu ce problème.
ActivatedRoute ne porte pas de données , et voici la solution pour détecter la variable de page dans le data: { page: 'login' }
.
import { Router, RoutesRecognized } from '@angular/router';
export class AppComponent {
page = '';
constructor(private router: Router) {
// listen to page variable from router events
router.events.subscribe(event => {
if (event instanceof RoutesRecognized) {
let route = event.state.root.firstChild;
this.page = 'page-' + route.data.page || '';
console.log('Page', this.page);
}
});
}
}
la réponse de asmmahmud fonctionne bien jusqu'à ce que Angular 5.x , mais 6.X casse le this.router.events
puisque rxjs 6.x a des changements radicaux. Donc, je viens de trouver une mise à jour:
import {filter} from 'rxjs/operators';
import {map, mergeMap} from 'rxjs/internal/operators';
router.events
.pipe(filter(event => event instanceof NavigationEnd),
map(() => {
let route = activatedRoute.firstChild;
let child = route;
while (child) {
if (child.firstChild) {
child = child.firstChild;
route = child;
} else {
child = null;
}
}
return route;
}),
mergeMap(route => route.data)
)
.subscribe(data => {
console.log(data);
});
Pour ceux qui utilisent maintenant Angular 6+ et le dernier RXJS 6, voici quelque chose basé sur les réponses précédentes:
Exemple de routage:
const routes: Routes = [
{path: 'home', component: HomeComponent, data: {title: 'Home'}},
// {path: '', redirectTo: 'home', pathMatch: 'full'},
{path: 'login', component: LoginComponent, data: {title: 'Login'}},
{path: 'dashboard', component: DashboardComponent, data: {title: 'Dashboard'}, canActivate: [AppAuthGuard]},
{path: 'eventDetails', component: EventCardComponent, data: {title: 'Details'}},
{path: '**', redirectTo: 'home', pathMatch: 'full'},
];
Comment obtenir l'exemple de titre:
ngOnInit() {
this.routerEventSubscription = this.router.events
.pipe(filter(event => event instanceof RoutesRecognized))
.pipe(map((event: RoutesRecognized) => {
return event.state.root.firstChild.data['title'];
})).subscribe(title => {
this.title = title;
});
}
Cela a fonctionné pour moi dans app.component.ts (ng 5)
constructor(
private router: Router,
) {
router.events.subscribe((routerEvent: Event) => {
this.checkRouterEvent(routerEvent);
});
}
checkRouterEvent(routerEvent: Event): void {
if (routerEvent instanceof ActivationStart) {
if (routerEvent.snapshot.data.custom_data) {
this.currentpage = routerEvent.snapshot.data['custom_data'];
console.log('4.' + this.currentpage);
}
}