• 定义子路由
    • 访问父路由的参数
    • 链接

    定义子路由

    当某些路由只能在其他路由中访问和查看时,可能适合将其创建为子路由。

    例如:产品详细信息页面可能有一个标签式导航部分,默认显示产品概述。 当用户单击“技术规格”选项卡时,该部分将显示规格。

    如果用户点击ID为3的产品,我们要显示产品详细信息页面,其中包含概述:

    localhost:3000/product-details/3/overview

    当用户点击 “Technical Specs”:

    localhost:3000/product-details/3/specs

    overviewspecs 作为 product-details/:id的子路由。 它们只能在产品详细信息中找到。

    我们的子 Routes 看起来像这样:

    1. export const routes: Routes = [
    2. { path: '', redirectTo: 'product-list', pathMatch: 'full' },
    3. { path: 'product-list', component: ProductList },
    4. { path: 'product-details/:id', component: ProductDetails,
    5. children: [
    6. { path: '', redirectTo: 'overview', pathMatch: 'full' },
    7. { path: 'overview', component: Overview },
    8. { path: 'specs', component: Specs }
    9. ]
    10. }
    11. ];

    这些子路由的组件将显示在哪里? 就像我们对于根应用程序组件有一个<router-outlet> </ router-outlet>,我们在ProductDetails组件中有一个路由出口。 对应于product-details的子路由的组件将被放置在ProductDetails中的路由出口。

    1. import { Component, OnInit, OnDestroy } from '@angular/core';
    2. import { ActivatedRoute } from '@angular/router';
    3. @Component({
    4. selector: 'product-details',
    5. template: `
    6. <p>Product Details: {{id}}</p>
    7. <!-- Product information -->
    8. <nav>
    9. <a [routerLink]="['overview']">Overview</a>
    10. <a [routerLink]="['specs']">Technical Specs</a>
    11. </nav>
    12. <router-outlet></router-outlet>
    13. <!-- Overview & Specs components get added here by the router -->
    14. `
    15. })
    16. export default class ProductDetails implements OnInit, OnDestroy {
    17. id: number;
    18. constructor(private route: ActivatedRoute) {}
    19. ngOnInit() {
    20. this.sub = this.route.params.subscribe(params => {
    21. this.id = +params['id']; // (+) converts string 'id' to a number
    22. });
    23. }
    24. ngOnDestroy() {
    25. this.sub.unsubscribe();
    26. }
    27. }

    或者,我们可以将overview路由URL简单地指定为:

    localhost:3000/product-details/

    1. export const routes: Routes = [
    2. { path: '', redirectTo: 'product-list', pathMatch: 'full' },
    3. { path: 'product-list', component: ProductList },
    4. { path: 'product-details/:id', component: ProductDetails,
    5. children: [
    6. { path: '', component: Overview },
    7. { path: 'specs', component: Specs }
    8. ]
    9. }
    10. ];

    由于product-detailsOverview子路由具有空路径,因此默认情况下将加载它。specs子路由保持不变。

    View Example with child routes

    View Example with route params & child routes

    查看以全屏模式运行的示例,以查看URL变化。

    访问父路由的参数

    在上述示例中,假设product-details 的子路由需要产品的ID以获取规范或概述信息。子路由组件可以访问父路由的参数,如下所示:

    1. export default class Overview {
    2. parentRouteId: number;
    3. private sub: any;
    4. constructor(private router: Router,
    5. private route: ActivatedRoute) {}
    6. ngOnInit() {
    7. // Get parent ActivatedRoute of this route.
    8. this.sub = this.router.routerState.parent(this.route)
    9. .params.subscribe(params => {
    10. this.parentRouteId = +params["id"];
    11. });
    12. }
    13. ngOnDestroy() {
    14. this.sub.unsubscribe();
    15. }
    16. }

    View Example child routes accessing parent’s route parameters

    查看以全屏模式运行的示例,以查看URL变化。

    链接

    路由可以使用/,或../;这告诉Angular 2在路由树链接到哪里。

    Prefix Looks in
    / Root of the application
    none Current component children routes
    ../ Current component parent routes

    例如:

    1. <a [routerLink]="['route-one']">Route One</a>
    2. <a [routerLink]="['../route-two']">Route Two</a>
    3. <a [routerLink]="['/route-three']">Route Three</a>

    在上面的例子中,路由一链接到当前路由的子节点。 路由二链接到当前路由的兄弟。 路由三链接到根组件的子节点(如果当前路由是根组件,则与路由一等效)。

    View Example with linking throughout route tree

    查看以全屏模式运行的示例,以查看URL变化。