=====Дочерние маршруты=====
В прошлых темах рассматривалась работа с обычными маршрутами. То есть система маршрутизации выбирает один из компонентов на основе url и помещает его в главный компонент AppComponent. Но что если выбранный компонент сам должен принимать в качестве внутреннего содержимого какой-то другой компонент в зависимости от запроса. В этому случае нам надо использовать дочерние маршруты (child route).\\
\\
К примеру, возьмем проект из прошлых тем:\\
\\
{{:angular:angular2:routing:7.18.png|}}\\
\\
Добавим в папку src/app два простеньких компонента. Вначале добавим файл **item.details.component.ts**:
import { Component} from '@angular/core';
@Component({
selector: 'item-details',
template: `Информация о товаре
`
})
export class ItemDetailsComponent{}
И также добавим второй файл **item.stat.component.ts**:
import { Component} from '@angular/core';
@Component({
selector: 'item-stat',
template: `Статистика товара
`
})
export class ItemStatComponent{}
Итак, есть два компонента ItemDetailsComponent и ItemStatComponent, которые условно раскрывают различные стороны одно и того же товара. Логически они относятся к ItemComponent, который также связан с определенным товаром.\\
\\
Мы бы могли определить прямые маршруты к этим компонентам типа:
{ path: 'item/:id/details', component: ItemDetailsComponent},
{ path: 'item/:id/stat', component: ItemStatComponent},
Где в данном случае id - также параметр маршрута, представляющий условный id товара.\\
\\
Но такие маршруты будут миновать компонент ItemComponent и никак его не затрагивают. Поэтому нам надо использовать другую организацию маршрутов. Для этого изменим модуль AppModule следующим образом:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import {Routes, RouterModule} from '@angular/router';
import { AppComponent } from './app.component';
import { HomeComponent } from './home.component';
import { ItemComponent } from './item.component';
import { ItemStatComponent } from './item.stat.component';
import { ItemDetailsComponent } from './item.details.component';
// определение дочерних маршрутов
const itemRoutes: Routes = [
{ path: 'details', component: ItemDetailsComponent},
{ path: 'stat', component: ItemStatComponent},
];
const appRoutes: Routes =[
{ path: 'item/:id', component: ItemComponent},
{ path: 'item/:id', component: ItemComponent, children: itemRoutes},
{ path: '', component: HomeComponent}
];
@NgModule({
imports: [ BrowserModule, RouterModule.forRoot(appRoutes)],
declarations: [
AppComponent, HomeComponent, ItemComponent,
ItemDetailsComponent, ItemStatComponent
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Каждый из дочерних маршрутов сопоставляется не совсем адресом url, а только с его частью. Далее чтобы применить такие маршруты, у маршрута для компонента ItemComponent применяется свойство **children**:
{ path: 'item/:id', component: ItemComponent, children: itemRoutes},
Теперь изменим ItemComponent:
import { Component} from '@angular/core';
import { ActivatedRoute} from '@angular/router';
import {Subscription} from 'rxjs';
@Component({
selector: 'item-info',
template: `Товар {{id}}
`
})
export class ItemComponent{
id: number;
private routeSubscription: Subscription;
constructor(private route: ActivatedRoute){
this.routeSubscription = route.params.subscribe(params=>this.id=params['id']);
}
}
Для вставки компонентов ItemDetailsComponent и ItemStatComponent здесь определен элемент .\\
\\
И изменим главный компонент AppComponent, добавив в него для тестирования ссылки на ItemDetailsComponent и ItemStatComponent:\\
import { Component} from '@angular/core';
@Component({
selector: 'my-app',
template: ``
})
export class AppComponent {}
При переходе по подобным ссылкам будет срабатывать маршрутизация к компоненту ItemComponent и ему будет передаваться параметр маршрута - id. И также будет срабатывать маршрутизация к ItemDetailsComponent или ItemStatComponent, если после id идет какой-нибудь сегмент "details" или "stat":\\
\\
{{ :angular:angular2:routing:7.12.png |}}\\
\\
{{ :angular:angular2:routing:7.13.png |}}