J'essaie d'obtenir les données d'un routeur chaque fois que la route change, mais je ne réussis pas. Ici, je définis la propriété asdf
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
LoginComponent,
DashboardComponent,
OverviewComponent,
],
imports: [
BrowserModule,
FormsModule,
RouterModule.forRoot([
{ path: '', pathMatch: 'full', redirectTo: '' },
{ component: LoginComponent, path: 'login' },
{
children: [
{ path: '', pathMatch: 'full', redirectTo: 'overview', data: { asdf: 'hello' } },
{ component: OverviewComponent, path: 'overview', data: { asdf: 'hello' } },
], component: DashboardComponent,
path: '',
},
]),
],
})
export class AppModule { }
Et ici, je peux obtenir l'URL du routeur lorsque la route change, mais asdf
n'est pas défini :(
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { ActivatedRoute, NavigationEnd } from '@angular/router';
@Component({
selector: 'cs-map',
styleUrls: ['map.component.css'],
templateUrl: 'map.component.html',
})
export class MapComponent implements OnInit {
private routerSub;
constructor(private router: Router, private activatedRoute: ActivatedRoute) { }
public ngOnInit() {
this.router.events.subscribe((val) => {
if (val instanceof NavigationEnd) {
let url = val.url;
console.log(this.activatedRoute.snapshot.data['asdf']); // data is defined but asdf is not :(
}
});
}
}
Comment puis-je obtenir la valeur de asdf
?
Edit: je navigue vers /overview
Sans while loop
constructor(private router: Router,
private activatedRoute: ActivatedRoute)
{
this.router.events
.filter(event => event instanceof NavigationEnd)
.map(() => this.activatedRoute)
.map(route => route.firstChild)
.switchMap(route => route.data)
.map(data => data['asdf'])
}
Ce qui suit est mis à jour pour fonctionner avec rxjs v6
constructor(private router: Router,
private activatedRoute: ActivatedRoute)
{
this.router.events
.pipe(
filter(event => event instanceof NavigationEnd),
map(() => this.activatedRoute),
map(route => route.firstChild),
switchMap(route => route.data),
map(data => data['asdf']))
}
les données dans les itinéraires doivent être un tableau d'objets plutôt que simplement un objet, alors définissez-les comme ceci
{ component: LoginComponent, path: 'login', data:[{myKey1: myValue1}] },
Maintenant, pour le récupérer, utilisez ce code dans le constructeur de vos composants
constructor(private router:Router, private activeRoute:ActivatedRoute) {
router.events
.filter(event => event instanceof NavigationEnd)
.map(_ => this.router.routerState.root)
.map(route => {
while (route.firstChild) route = route.firstChild;
return route;
})
.flatMap(route => route.data)
.subscribe(data => {
console.log(data[0].myKey1);
});
}