Trasy podrzędne
Gdy niektóre trasy mogą być dostępne i wyświetlane tylko w innych trasach, może być wskazane utworzenie ich jako tras podrzędnych.
Na przykład: strona z informacjami o produkcie może mieć sekcję nawigacyjną z kartami, która domyślnie wyświetla przegląd produktów. Gdy użytkownik kliknie kartę Specyfikacje techniczne
, sekcja pokazuje specyfikacje.
Jeśli użytkownik kliknie produkt z identyfikatorem 3, chcemy wyświetlić stronę z informacjami o produkcie z przeglądem:
localhost: 3000/product-details/3/overview
Gdy użytkownik kliknie Dane techniczne
:
localhost: 3000/product-details/3/specs
overview
ispecs
są ścieżkami podrzędnymi product-details/:id
. Są dostępne tylko w ramach szczegółów produktu.
Nasze Routes
z dziećmi wyglądałyby tak:
export const routes: Routes = [
{ path: '', redirectTo: 'product-list', pathMatch: 'full' },
{ path: 'product-list', component: ProductList },
{ path: 'product-details/:id', component: ProductDetails,
children: [
{ path: '', redirectTo: 'overview', pathMatch: 'full' },
{ path: 'overview', component: Overview },
{ path: 'specs', component: Specs }
]
}
];
Gdzie byłyby wyświetlane komponenty dla tych tras podrzędnych? Tak jak mieliśmy <router-outlet></router-outlet>
<dla głównego komponentu aplikacji, mielibyśmy gniazdo routera wewnątrz komponentuProductDetails
. Komponenty odpowiadające ścieżkom podrzędnym o detalach produktu
zostaną umieszczone w gniazdach routera w ProductDetails
.
import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'product-details',
template: `
<p>Product Details: {{id}}</p>
<!-- Product information -->
<nav>
<a [routerLink]="['overview']">Overview</a>
<a [routerLink]="['specs']">Technical Specs</a>
</nav>
<router-outlet></router-outlet>
<!-- Overview & Specs components get added here by the router -->
`
})
export default class ProductDetails implements OnInit, OnDestroy {
id: number;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
this.id = +params['id']; // (+) converts string 'id' to a number
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
Ewentualnie możemy podać adres URL overview
route po prostu jako:
localhost: 3000/szczegóły produktu/3
export const routes: Routes = [
{ path: '', redirectTo: 'product-list', pathMatch: 'full' },
{ path: 'product-list', component: ProductList },
{ path: 'product-details/:id', component: ProductDetails,
children: [
{ path: '', component: Overview },
{ path: 'specs', component: Specs }
]
}
];
Ponieważ ścieżka podrzędna Overview
ścieżkiproduct-details
ma pustą ścieżkę, zostanie załadowana domyślnie. Trasa specs
pozostaje taka sama.
Wyświetl przykład z trasami podrzędnymi [049]
Zobacz przykład z parametrami trasy i ścieżkami podrzędnymi [050]
Wyświetl przykłady działające w trybie pełnoekranowym, aby zobaczyć zmiany trasy w adresie URL.
Dostęp do parametrów trasy rodzica
W powyższym przykładzie powiedz, że ścieżki podrzędne o detalach produktu
wymagały identyfikatora produktu, aby pobrać specyfikację lub informacje ogólne. Komponent ścieżki podrzędnej może uzyskać dostęp do parametrów trasy nadrzędnej w następujący sposób:
export default class Overview {
parentRouteId: number;
private sub: any;
constructor(private router: Router,
private route: ActivatedRoute) {}
ngOnInit() {
// Get parent ActivatedRoute of this route.
this.sub = this.router.routerState.parent(this.route)
.params.subscribe(params => {
this.parentRouteId = +params["id"];
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
Wyświetl przykładowe trasy potomne uzyskujące dostęp do parametrów trasy nadrzędnej [051]
Linki
Trasy mogą być poprzedzone /
lub ../
; to mówi Angularowi, gdzie w drzewie tras do połączenia.
Prefiks | Wygląda |
---|---|
/ |
Root aplikacji |
brak | Bieżące ścieżki potomne komponentu |
../ |
Bieżące trasy macierzyste komponentu |
Przykład:
<a [routerLink]="['route-one']">Route One</a>
<a [routerLink]="['../route-two']">Route Two</a>
<a [routerLink]="['/route-three']">Route Three</a>
W powyższym przykładzie łącze do pierwszej trasy łączy się z dzieckiem bieżącej trasy.
Łącze do trasy drugiej łączy się z rodzeństwem obecnej trasy.
Łącze dla trasy 3 łączy się z potomkiem komponentu głównego (tak samo, jak trasa na jeden link, jeśli bieżąca trasa jest komponentiem głównym).