Skip to content

Des routes enfants

Appelé aussi "routes imbriqués", les routes enfants permettent de mettre une navigation dans une vue.

Par exemple :

http://localhost/users/1337/profile

Affichera un composant Profile pour le profil de l'utilisateur

http://localhost/users/1337/roles

Affichera un composant Roles pour les différents rôles de l'utilisateur Cela peut s'apparenter à un menu avec des boutons changeant une page.

Nous pouvons donc créer un fichier user.router.ts que nous plaçons dans le dossier user. Notre structure est la suivante :

<root>
  user  
    user.component.ts
    user.module.ts
    user-profile.component.ts
    user-role.component.ts
    user.router.ts
  app.router.ts
  app.component.ts
  app.module.ts

Le fichier user.router.ts a ce code :

js
import {RouterModule, Routes} from '@angular/router';
import {UserComponent} from './user.component';
import {UserProfileComponent} from './user-profile.component';
import {UserRoleComponent} from './user-role.component';

const routes:Routes = [
  {
    path: 'users/:id',
    component:  UserComponent,
    children: [
          {
            path: 'profile',
            component: UserProfileComponent
          },
          {
            path: 'roles',
            component: UserRoleComponent
          }
      ]
  },
];

export const UserRouting = RouterModule.forChild(routes);
import {RouterModule, Routes} from '@angular/router';
import {UserComponent} from './user.component';
import {UserProfileComponent} from './user-profile.component';
import {UserRoleComponent} from './user-role.component';

const routes:Routes = [
  {
    path: 'users/:id',
    component:  UserComponent,
    children: [
          {
            path: 'profile',
            component: UserProfileComponent
          },
          {
            path: 'roles',
            component: UserRoleComponent
          }
      ]
  },
];

export const UserRouting = RouterModule.forChild(routes);

Le code est très ressemblant. Notez juste que nous avons la propriété children qui définit les différents composants pour le routeur enfant. Nous configurons le module avec forChild()

Ajouter au module

Comme pour le routeur parent, nous ajoutons aux modules racines (app.module.ts) :

js
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';
import {UserModule} from './user/user.module';
import {AppComponent} from './app.component';
import {routing} from './app.router';
import {UserRouting} from './user/user.router';

@NgModule({
  imports: [BrowserModule, UserModule, routing, UserRouting],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {

}
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';
import {UserModule} from './user/user.module';
import {AppComponent} from './app.component';
import {routing} from './app.router';
import {UserRouting} from './user/user.router';

@NgModule({
  imports: [BrowserModule, UserModule, routing, UserRouting],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {

}

Router-Outlet

Le premier <router-outlet> se trouve dans AppComponent comme d'habitude. Le deuxième se trouve UserComponent.

js
import {Component, OnInit} from '@angular/core';
import {ActivatedRoute} from '@angular/router';

@Component({
  selector: 'other',
  template: `
    Utilisateur {{id}}
    <router-outlet></router-outlet>
  `
})
export class OtherComponent implements OnInit {

  id:number;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.params.subscribe(params => this.id = +params.id);
  }

}
import {Component, OnInit} from '@angular/core';
import {ActivatedRoute} from '@angular/router';

@Component({
  selector: 'other',
  template: `
    Utilisateur {{id}}
    <router-outlet></router-outlet>
  `
})
export class OtherComponent implements OnInit {

  id:number;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.params.subscribe(params => this.id = +params.id);
  }

}

Encore une chose à penser

Ici, nous avons un module nommé user.module.ts. Ce module intègre les 3 composants (UserComponent, UserProfileComponent et UserRoleComponent). Cependant, dans UserComponent ci-dessous, nous utilisons les directives du routeur. Pour que Angular puisse les utiliser, il faut importer le module routeur dans le module UserModule :

js
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';

import {UserComponent} from './user.component';
import {UserProfileComponent} from './user-profile.component';
import {UserRoleComponent} from './user-role.component';

import {UserRouting} from './user/user.router';

@NgModule({
  imports: [BrowserModule, UserRouting],
  declarations: [UserComponent, UserProfileComponent, UserRoleComponent],
  exports: [UserComponent]
})
export class UserModule {

}
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';

import {UserComponent} from './user.component';
import {UserProfileComponent} from './user-profile.component';
import {UserRoleComponent} from './user-role.component';

import {UserRouting} from './user/user.router';

@NgModule({
  imports: [BrowserModule, UserRouting],
  declarations: [UserComponent, UserProfileComponent, UserRoleComponent],
  exports: [UserComponent]
})
export class UserModule {

}