• 10 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 12/11/2024

Passez d'une route à l'autre

Dans le chapitre précédent, vous avez ajouté un module de routing, et vous y avez enregistré deux routes fonctionnelles. Tout ce qui reste à faire, c'est de permettre à vos utilisateurs de changer de route !

Créez des liens avec  routerLink

Le routeur d'Angular vous met à disposition une directive pour créer ultra facilement des liens vers des routes de vos applications, et cette directive s'appelle  routerLink. Elle est très facile à utiliser : on lui passe simplement la chaîne de caractères qui correspond à la route vers laquelle on veut créer le lien.

Dans LandingPageComponent, ajoutez l'import  RouterLink  (depuis  @angular/router  ) :

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  // ...
  imports: [
    RouterLink
  ],
  // ...
})
export class LandingPageComponent {

}

Cela vous permet, dans le template, de faire :

<a routerLink="facesnaps">Continuer vers Snapface</a>

Maintenant, quand vous cliquez sur le lien de votre landing page, vous êtes redirigé immédiatement vers FaceSnapListComponent, sans chargement depuis le serveur !

Allons un peu plus loin encore ! Dans HeaderComponent, vous allez ajouter un menu de navigation.

Dans le fichier TypeScript, importez  RouterLink  ainsi que  RouterLinkActive  (on le verra dans quelques instants) :

import { Component } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';

@Component({
  // ...
  imports: [
    RouterLink,
    RouterLinkActive
  ],
  // ...
})
export class HeaderComponent {

}

Comme ça, dans le template, vous pouvez commencer par ajouter :

<header>
  <h1>snapface</h1>
  <nav>
    <a routerLink="">Home</a>
    <a routerLink="facesnaps">FaceSnaps</a>
  </nav>
</header>

Ajoutez quelques styles pour que ce soit un peu plus propre ; voici ma proposition :

a {
  margin: 0 10px;
  color: #333;
  text-decoration: none;
  &:hover {
    text-decoration: underline;
  }
}

.active {
  color: #666;
  text-decoration: underline;
}

Avec ces deux liens, vous avez un menu de navigation dans votre header, et vous pouvez bien vous rendre compte de la vitesse de changement de route !

Le nouveau header contient les liens
Le nouveau header

Vous avez peut-être remarqué que je vous ai fourni une classe  active  dans les styles. L'extension  RouterLinkActive  que vous avez importé permet d'attribuer une classe CSS au lien quand sa route est la route active :

<header>
  <h1>snapface</h1>
  <nav>
    <a routerLink="" routerLinkActive="active">Home</a>
    <a routerLink="facesnaps" routerLinkActive="active">FaceSnaps</a>
  </nav>
</header>

Vous passez simplement la classe à attribuer à  routerLinkActive.

En fait, une route est considérée comme étant active lorsqu'elle-même ou l'un de ses enfants est la route sélectionnée. On voit bien que  /facesnaps  est un enfant de  /, donc finalement Angular se comporte normalement. Cependant, il existe une configuration qui permet de considérer uniquement la route exacte et non ses enfants. Il suffit d'ajouter : 

<a routerLink="" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">Home</a>

Et maintenant, tout fonctionne comme on voudrait !

Seulement le lien FaceSnaps est souligné
La route exacte

Naviguez avec le Router

Il existe une autre approche pour changer de route dans une application Angular. Vous pouvez injecter le Router dans vos components et changer de route programmatiquement.

Les prochaines étapes, si vous voulez essayer de les implémenter vous-même, sont :

  • transformer le lien sur la landing page en bouton ;

  • reprendre les styles de bouton de FaceSnapComponent en augmentant la taille de police à 20 px ;

  • lier une méthode avec un nom approprié à ce bouton ;

  • BONUS : injecter le Router dans LandingPageComponent – il s'importe depuis  @angular/router  et s'injecte comme un service.

C'est à vous !

Et maintenant la solution.

On peut commencer par la méthode qui sera liée au bouton. J'ai choisi de l'appeler  onContinue()  ; à partir du moment où le nom de votre méthode commence par on et décrit l'action, tout va bien !

Après avoir créé la méthode vide dans LandingPageComponent, je transforme le lien en bouton et j'y lie la nouvelle méthode :

<button (click)="onContinue()">Continuer vers Snapface</button>

On peut copier/coller le style du bouton depuis FaceSnapComponent en modifiant la taille de police :

button {
  background-color: transparent;
  box-sizing: border-box;
  padding: 5px 10px;
  border: none;
  box-shadow: lightgray 3px 3px 7px;
  margin-right: 20px;
  outline: none;
  font-size: 20px;
  font-weight: 500;
  &:active {
    transform: translate(1px, 1px);
    box-shadow: lightgray 0 0 5px;
  }
}

Ensuite, pour injecter le Router, c'est aussi simple qu'avec un service :

import { Router } from '@angular/router';
//...
constructor(private router: Router) { }

Maintenant il ne reste plus qu'à appeler la méthode  navigateByUrl()  du Router depuis la méthode  onContinue()  :

onContinue() {
    this.router.navigateByUrl('facesnaps');
}

Et ça y est, le bouton de la landing page vous redirige vers la route FaceSnaps !

En résumé

  • Créez des liens qui permettent de passer d'une route à l'autre avec RouterLink.

  • Ajoutez des classes CSS aux liens correspondants à la route activée avec  RouterLinkActive.

  • Ignorez l'activation des routes enfants avec  [routerLinkActiveOptions]="{ exact: true }".

  • Injectez le Router dans vos components et utilisez sa méthode  navigateByUrl()  pour de la navigation programmatique.

 Enfin, nous allons activer les routes dans le prochain chapitre !

Exemple de certificat de réussite
Exemple de certificat de réussite