TP 2

Le composant Chronomètre

Nous allons dans ce TP créer un composant Chronomètre. Nous verrons ainsi comment créer un composant ainsi que la création d'un Pipe pour formater l'affiche du composant.

Notre premier composant

Dans le dossier src/app, créer un dossier chrono. Ce dossier contiendra les fichiers html, css et ts.

Voici la sctructure cible du projet :

src/app
├── app.component.css
├── app.component.html
├── app.component.spec.ts
├── app.component.ts
├── app.module.ts
└── chrono
    ├── chrono.component.css
    ├── chrono.component.html
    └── chrono.component.ts

Vous devez donc créer les fichiers nécessaires au componsant Chrono !

Ensuite éditez le fichier chrono.component.ts et collez le contenu suivant :

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

@Component({
    selector: 'chrono',
    templateUrl: './chrono.component.html',
    styleUrls: ['./chrono.component.css']
})
export class ChronoComponent implements OnInit {
    
    constructor() {
        
    }
    
    ngOnInit() {
        
    }
}

Puis ajoutez le composant dans la liste des composants de AppModule comme suivant :

@NgModule({
    declarations: [
        AppComponent,
        ChronoComponent // <- Ici
    ],
    ...
})
export class AppModule { }

Vous devez systématiquement déclarer votre composant en tant que dépendence du module pour l'utiliser !

Exercice 1 - Template

Commencez par créer le template HTML nécessaire à l'affichage des données du chronomètre telles que:

Et n'oubliez pas le bouton start/stop du chrono !

Voici un exemple de ce qui est attendu :

max-300

Vous pouvez utiliser @angular/material pour créer un bouton et votre composant comme suivant :

<div>
    <span class="times">0</span>
    <button mat-raised-button>Start</button>
</div>

Pour le css :

:host {
    text-align: center;
    display: block;
    width: 200px;
    height: 200px;
    margin: auto;
    background: #222;
    padding: 30px;
    border-radius: 100%;
    position: relative;
    z-index: 0;
}
:host>div {
    position: relative;
    z-index: 3;
}
:host:after {
    content: ' ';
    position: absolute;
    width: 206px;
    height: 206px;
    border: 5px solid #414141;
    border-radius: 100%;
    top: -8px;
    left: -8px;
    padding: 30px;
    z-index: 0;
}
:host .times {
    display: block;
    font-size:50px;
    color:white;
    margin-bottom: 50px;
    padding-top: 30px;
}

:hover button {

}

Note : le selecteur :host représente l'élément encapsulant votre composant Angular.

Exercice 2 - Création de l'action click

À partir du cours, essayez de créer une action au click du bouton.

Exercice 3

Maintenant que vous avez créé l'action au click du bouton, implémentez les méthodes startTimer() et stopTimer().

Notre premier Pipe

En l'état l'affichage des minutes, secondes et millisecondes n'est pas correct (cf. capture chrono).

Nous allons donc créer un Pipe, équivalent des filtres Angular 1, pour formatter les données.

src/app
├── app.component.css
├── app.component.html
├── app.component.spec.ts
├── app.component.ts
├── app.module.ts
├── chrono
│   ├── chrono.component.css
│   ├── chrono.component.html
│   ├── chrono.component.spec.ts
│   └── chrono.component.ts
└── dec-to-str.pipe.ts

Commencez par créer le fichier dec-to-str.pipe.ts. Créez la classe DecToStrPipe comme présenté dans le cours.

Exercice

Le filtre doit transformer/formatter un entier vers un string sur deux chiffres !

Correction du TP : tp2-solution

Suivant