javascript - Globálisan elérhető URL-paraméter az Angular routerben
Próbálok létrehozni egy térképközpontú alkalmazást, hasonlót a Google Maps-hez. Tehát főként egy térkép van, és az URL útvonalától függően egy komponenst töltenek be egy kis oldalsó panelen belül.
export const routes: Routes = [
{path: 'home/:coordinates', component: HomeComponent},
{path: 'dashboard/:coordinates', component: DashboardComponent},
{path: 'utils/:coordinates', component: UtilsDemo},
];
Amit el szeretnék érni, az hasonló a Google Maps-hez:
/home/@54.072,-2.899 --> betölti a HomeComponent-et és a 54.072,-2.899 koordinátákra navigál
/dashboard/@53.123,2.345 --> betölti a DashboardComponent-et és a 54.123,2.345 koordinátákra navigál
Azonban a :coordinates paraméternek nem szabad a komponenshez helyi szinten tartoznia, hanem valahogy globálisan kellene. Különben a navigációs részt minden egyes komponensben meg kellene csinálnom.
Más szóval: Ha ezt teszem:
this.route.params.subscribe(params => {
console.log(params['coordinates']);
});
A AppComponent-en belül a paraméter nincs meghatározva. Ez csak az egyes konkrét komponenseken belül működik.
Van valami mód erre Angular5-ben?
Válasz #1
Talán a Route Resolver egy lehetőség számodra. Általában arra használják, hogy adatokat kérjenek le a szerverről, mielőtt egy útvonalra navigálnának, de te egyszerűen beletehetnéd a navigációs logikádat is.
- Hozzon létre egy
NavigationResolverszolgáltatást a navigációs logikájához - A szolgáltatás megvalósítja a Resolve interfészt.
A
resolvemetóduson belül kiemeled a paramétereket, és elindítod a navigációs logikátresolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Crisis> { let coordinates = route.paramMap.get('coordinates'); // This is where your navigation happens return this.navigateTo(coordinates) }Hozzáadod a
NavigationResolver-t minden olyan útvonalhoz, amelynek kezelnie kell a paramétereket:{ path: 'home/:coordinates', component: HomeComponent, resolve: { navigationResult: NavigationResolver } },Szükség esetén a feloldott navigációs adatokhoz a komponenseiden belül is hozzáférhetsz a következő módon
ngOnInit() { this.route.data .subscribe((data: { navigationResult: NavigationResult }) => { this.navigation = data.navigationResult; }); }
Olvasson többet a Útvonal-feloldókról a hivatalos dokumentációban.
Válasz #2
Alternatív megoldás: Használjon lekérdezési paramétereket
Az útvonal paraméterek példájában csak az útvonalra specifikus paraméterekkel foglalkoztál, de mi van akkor, ha opcionális paramétereket szeretnél, amelyek minden útvonalhoz elérhetők? Itt lépnek be a képbe a lekérdezési paraméterek.
Feliratkozhat a ActivatedRoute queryParamMap-jára (például az AppComponent-ben), és elvégezheti a navigációs logikát, amikor a paraméter megváltozik:
this.route
.queryParamMap
.map(params => params.get('coordinates'))
.subscribe(coordinates => this.navigationService.navigateTo(coordinates))
