Concepts de base d'Angular
Concepts de base d'Angular
1 / 102
Plan
1 Introduction
3 Directives Angular
*ngFor
*ngIf
ngSwitch
ngPlural
ngStyle
ngClass
2 / 102
Plan
5 Valeurs réactives
signal
computed
effect
3 / 102
Introduction
Angular
4 / 102
Introduction
Angular
5 / 102
Introduction
Angular
{{ Interpolation }}
Welcome to {{ title }} ! :
title sera remplacé par sa valeur dans app.component.ts
5 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
Objectif : afficher les attributs et les valeurs sous forme d’une liste HTML
H I ©
Créer un répertoire classes dans app où toutes les classes seront stockées.
EL
OU
Créer une classe Stagiaire avec les attributs num, nom et prénom.
M
f E
Créer un objet de cette classe dansLapp.component.ts
c e
hcetr objet sous forme de liste dans
© A
Afficher les valeurs
app.component.html
de
6 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
7 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
7 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
Remarque
7 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Contenu de stagiaire.ts
8 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'cours-angular';
stagiaire: Stagiaire = new Stagiaire(100, 'Wick', 'John');
constructor() {
}
}
9 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
10 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
L’écriture suivante
{{ stagiaire }}
Angular
L’écriture suivante
{{ stagiaire }}
affiche
[object Object]
11 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
L’écriture suivante
{{ stagiaire }}
affiche
[object Object]
Angular
L’écriture suivante
{{ stagiaire }}
affiche
[object Object]
Le résultat est
{ "_num": 100, "_nom": "Wick", "_prenom": "John" }
Angular
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'cours-angular';
stagiaire: Stagiaire = new Stagiaire(100, 'Wick');
constructor() {
}
}
12 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
<ul>
<li> Nom : {{ stagiaire.nom }} </li>
<li> Prénom : {{ stagiaire.prenom ?? "prénom indéfini" }} </li>
</ul>
Angular
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'cours-angular';
stagiaire: Stagiaire = new Stagiaire(100, 'Wick', 'John');
tab: number[] = [2, 3, 5, 8];
constructor() {
}
}
<ul>
<li> {{ tab[0] }} </li>
<li> {{ tab['1'] }} </li>
<li> {{ tab["2"] }} </li>
<li> {{ tab[3] }} </li>
</ul>
15 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
<ul>
<li> {{ tab[0] }} </li>
<li> {{ tab['1'] }} </li>
<li> {{ tab["2"] }} </li>
<li> {{ tab[3] }} </li>
</ul>
Remarques
<ul>
<li> {{ tab[0] }} </li>
<li> {{ tab['1'] }} </li>
<li> {{ tab["2"] }} </li>
<li> {{ tab[3] }} </li>
</ul>
Remarques
Solution
15 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
Ajouter une méthode direBonjour() dans app.component.ts
16 / 102
Liaison template/classe (composant) Interpolation {{ ... }}
Angular
17 / 102
Liaison template/classe (composant) Property binding [ ... ]
Angular
Pour afficher le contenu de l’attribut title dans le template, on peut utiliser
l’interpolation
18 / 102
Liaison template/classe (composant) Property binding [ ... ]
Angular
Pour afficher le contenu de l’attribut title dans le template, on peut utiliser
l’interpolation
<p [textContent]=title></p>
18 / 102
Liaison template/classe (composant) Property binding [ ... ]
Angular
Pour afficher le contenu de l’attribut title dans le template, on peut utiliser
l’interpolation
<p [textContent]=title></p>
[ property binding ]
[property] = ’value’ : permet de remplacer value par sa valeur dans la
classe app.component.ts
18 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Évènement (Event)
19 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Évènement (Event)
19 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Ajoutons la méthode alertBonjour() dans app.component.ts
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'cours-angular';
stagiaire: Stagiaire = new Stagiaire(100, 'Wick', 'John');
tab: number[] = [2, 3, 5, 8];
constructor() {
}
alertBonjour(): void {
console.log('bonjour Angular');
}
}
20 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
21 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Exercice
Créer deux boutons HTML dont l’un est initialement désactivé (disabled).
À chaque clic sur le bouton activé, celui-ci se désactive tandis que l’autre s’active.
22 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Solution
23 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Solution
disabled = true
23 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Considérons la zone de saisie suivante dans laquelle nous ne voudrions
accepter que des lettres en minuscule
<div>
<label for="texte"> Merci de bien saisir un texte :
</label>
<input type="text" id="texte" (input)="showValue($event)">
</div>
24 / 102
Liaison template/classe (composant) Event binding ( ... )
Angular
Considérons la zone de saisie suivante dans laquelle nous ne voudrions
accepter que des lettres en minuscule
<div>
<label for="texte"> Merci de bien saisir un texte :
</label>
<input type="text" id="texte" (input)="showValue($event)">
</div>
showValue(event: Event) {
console.log((event.target as HTMLInputElement).value);
// affiche tous les caractères saisis
console.log((event as InputEvent).data);
// affiche le dernier caractère saisi
}
24 / 102
Directives Angular
Angular
Plusieurs directives possibles
*ngFor
*ngIf
*ngSwitch
ngStyle
ngClass
25 / 102
Directives Angular
Angular
Plusieurs directives possibles
*ngFor
*ngIf
*ngSwitch
ngStyle
ngClass
ng-container
ng-template
25 / 102
Directives Angular *ngFor
Angular
*ngFor
permet de répéter un traitement (affichage d’un élément HTML)
s’utilise comme un attribut de balise et sa valeur est une
instruction itérative TypeScript
26 / 102
Directives Angular *ngFor
Angular
Afficher les éléments du tableau tab en utilisant *ngFor
<ul>
<li *ngFor="let elt of tab">
{{ elt }}
</li>
</ul>
27 / 102
Directives Angular *ngFor
Angular
Afficher les éléments du tableau tab en utilisant *ngFor
<ul>
<li *ngFor="let elt of tab">
{{ elt }}
</li>
</ul>
<ul>
<ng-template ngFor let-elt [ngForOf]="tab">
<li>{{ elt }} </li>
</ng-template>
</ul>
27 / 102
Directives Angular *ngFor
Angular
Afficher les éléments du tableau tab en utilisant *ngFor
<ul>
<li *ngFor="let elt of tab">
{{ elt }}
</li>
</ul>
<ul>
<ng-template ngFor let-elt [ngForOf]="tab">
<li>{{ elt }} </li>
</ng-template>
</ul>
27 / 102
Directives Angular *ngFor
<ul>
<li *ngFor="let elt of tab; let i = index">
{{ i }} : {{ elt }}
</li>
</ul>
28 / 102
Directives Angular *ngFor
<ul>
<li *ngFor="let elt of tab; let i = index">
{{ i }} : {{ elt }}
</li>
</ul>
ou
<ul>
<li *ngFor="let elt of tab; index as i">
{{ i }} : {{ elt }}
</li>
</ul>
28 / 102
Directives Angular *ngFor
<ul>
<li *ngFor="let elt of tab; let i = index">
{{ i }} : {{ elt }}
</li>
</ul>
ou
<ul>
<li *ngFor="let elt of tab; index as i">
{{ i }} : {{ elt }}
</li>
</ul>
<ul>
<ng-template ngFor let-i="index" let-elt [ngForOf]="tab">
<li> {{ i }} : {{ elt }} </li>
</ng-template>
</ul>
28 / 102
Directives Angular *ngFor
Angular
On peut aussi utiliser first pour savoir si l’élément courant est le premier de la liste
<ul>
<li *ngFor="let elt of tab; let i = index; let isFirst = first">
{{ i }} : {{ elt }} : {{ isFirst }}
</li>
</ul>
29 / 102
Directives Angular *ngFor
Angular
On peut aussi utiliser first pour savoir si l’élément courant est le premier de la liste
<ul>
<li *ngFor="let elt of tab; let i = index; let isFirst = first">
{{ i }} : {{ elt }} : {{ isFirst }}
</li>
</ul>
last : retourne true si l’élément courant est le dernier de la liste, false sinon.
even : retourne true si l’indice de l’élément courant est pair, false sinon.
odd : retourne true si l’indice de l’élément courant est impair, false sinon.
29 / 102
Directives Angular *ngFor
Angular
30 / 102
Directives Angular *ngFor
Angular
Exercice
Écrire un script Angular qui permet d’afficher dans une liste HTML les nom
et prénom de chaque stagiaire de la liste stagiaires.
30 / 102
Directives Angular *ngFor
Angular
Solution
<ul>
<li *ngFor="let st of stagiaires">
{{ st.prenom }} : {{ st.nom }}
</li>
</ul>
31 / 102
Directives Angular *ngFor
Angular
Considérons la méthode suivante (à déclarer dans app.component.ts)
ajouterStagiaires() {
this.stagiaires = [
new Stagiaire(100, 'Wick', 'John'),
new Stagiaire(101, 'Abruzzi', 'John'),
new Stagiaire(102, 'Marley', 'Bob'),
new Stagiaire(103, 'Segal', 'Steven'),
new Stagiaire(104, 'Dalton', 'Jack'),
new Stagiaire(105, 'Maggio', 'Carol')
];
}
32 / 102
Directives Angular *ngFor
Angular
Considérons la méthode suivante (à déclarer dans app.component.ts)
ajouterStagiaires() {
this.stagiaires = [
new Stagiaire(100, 'Wick', 'John'),
new Stagiaire(101, 'Abruzzi', 'John'),
new Stagiaire(102, 'Marley', 'Bob'),
new Stagiaire(103, 'Segal', 'Steven'),
new Stagiaire(104, 'Dalton', 'Jack'),
new Stagiaire(105, 'Maggio', 'Carol')
];
}
<ul>
<li *ngFor="let st of stagiaires">
{{ st.prenom }} : {{ st.nom }}
</li>
</ul>
<button (click)="ajouterStagiaires()">Actualiser</button>
32 / 102
Directives Angular *ngFor
Angular
En cliquant sur le bouton, la liste (et la partie du DOM associée)
sera entièrement reconstruite
33 / 102
Directives Angular *ngFor
Angular
Question
34 / 102
Directives Angular *ngFor
Angular
Question
Réponse
Utiliser trackBy dans *ngFor qui permet de suivre les éléments lorsqu’ils
sont ajoutés ou supprimés du tableau pour des meilleures performances.
34 / 102
Directives Angular *ngFor
Angular
Nous devons définir une méthode trackBy qui identifie chaque élément de manière
unique
35 / 102
Directives Angular *ngFor
Angular
Nous devons définir une méthode trackBy qui identifie chaque élément de manière
unique
<ul>
<li *ngFor="let st of stagiaires; trackBy:trackByStagiaireNum">
{{ st.prenom }} : {{ st.nom }}
</li>
</ul>
<button (click)="ajouterStagiaires()">Actualiser</button>
35 / 102
Directives Angular *ngFor
Angular
En cliquant sur le bouton, les deux derniers éléments ont été
ajoutés au DOM sans reconstruire intégralement la liste
H I ©
UEL
O
f E LM
ch r e
©A
36 / 102
Directives Angular *ngFor
Angular
<ul>
<ng-template ngFor let-st [ngForOf]="stagiaires" [ngForTrackBy]="
trackByStagiaireNum">
<li>
{{ st.prenom }} : {{ st.nom }}
</li>
</ng-template>
</ul>
<button (click)="ajouterStagiaires()">Actualiser</button>
37 / 102
Directives Angular *ngFor
Angular
Remarques
*ngFor nous permet d’itérer sur les tableaux, mais pas sur les
objets.
Il est possible d’itérer sur les objets en utilisant le pipe keyvalue.
38 / 102
Directives Angular *ngIf
Angular
Pour tester puis afficher si le deuxième élément du tableau est impair
<ul>
<li *ngIf="tab[1] % 2 != 0">
{{ tab[1] }} est impair
</li>
</ul>
39 / 102
Directives Angular *ngIf
Angular
Pour tester puis afficher si le deuxième élément du tableau est impair
<ul>
<li *ngIf="tab[1] % 2 != 0">
{{ tab[1] }} est impair
</li>
</ul>
Ou en plus long
<ul>
<ng-template [ngIf]="tab[1] % 2 != 0">
<li>
{{ tab[1] }} est impair
</li>
</ng-template>
</ul>
39 / 102
Directives Angular *ngIf
Angular
Exercice
Utiliser les directives Angular pour afficher le premier élément du
tableau (tab) ainsi que sa parité (pair ou impair).
40 / 102
Directives Angular *ngIf
<ul>
<li *ngIf="tab[0] % 2 != 0; else pair">
{{ tab[0] }} est impair
</li>
<ng-template #pair>
<li>
{{ tab[0] }} est pair
</li>
</ng-template>
</ul>
41 / 102
Directives Angular *ngIf
<ul>
<li *ngIf="tab[0] % 2 != 0; else pair">
{{ tab[0] }} est impair
</li>
<ng-template #pair>
<li>
{{ tab[0] }} est pair
</li>
</ng-template>
</ul>
Ou en plus long
<ul>
<ng-template [ngIf]="tab[0] % 2 != 0" [ngIfElse]=pair>
<li>
{{ tab[0] }} est impair
</li>
</ng-template>
<ng-template #pair>
<li>
{{ tab[0] }} est pair
</li>
</ng-template>
</ul>
41 / 102
Directives Angular *ngIf
Une deuxième solution avec *ngIf, then et else
<ul>
<li *ngIf="tab[0] % 2 != 0; then impair else pair">
Ce code ne sera jamais pris en compte
</li>
<ng-template #impair>
<li>
{{ tab[0] }} est impair
</li>
</ng-template>
<ng-template #pair>
<li>
{{ tab[0] }} est pair
</li>
</ng-template>
</ul>
42 / 102
Directives Angular *ngIf
Une deuxième solution avec *ngIf, then et else
<ul>
<li *ngIf="tab[0] % 2 != 0; then impair else pair">
Ce code ne sera jamais pris en compte
</li>
<ng-template #impair>
<li>
{{ tab[0] }} est impair
</li>
</ng-template>
<ng-template #pair>
<li>
{{ tab[0] }} est pair
</li>
</ng-template>
</ul>
Ou en plus long
<ul>
<ng-template [ngIf]="tab[0] % 2 != 0" [ngIfThen]=impair [ngIfElse]=pair></ng-template>
<ng-template #impair>
<li>
{{ tab[0] }} est impair
</li>
</ng-template>
<ng-template #pair>
<li>
{{ tab[0] }} est pair
</li>
</ng-template>
</ul>
42 / 102
Directives Angular *ngIf
Angular
Remarque
43 / 102
Directives Angular *ngIf
Angular
Exercice
Utiliser les directives Angular pour afficher sous forme d’une liste
HTML tous les éléments du tableau précédent (tab) ainsi que leur
parité.
44 / 102
Directives Angular *ngIf
Angular
Solution
<ul>
<ng-container *ngFor="let elt of tab">
<li *ngIf="elt % 2 != 0; else sinon">
{{ elt }} est impair
H I ©
EL
</li>
<ng-template #sinon>
O U
LM
<li>
r e f E
{{ elt }} est pair
ch
</li>
©A
</ng-template>
</ng-container>
</ul>
45 / 102
Directives Angular *ngIf
Angular
Solution
<ul>
<ng-container *ngFor="let elt of tab">
<li *ngIf="elt % 2 != 0; else sinon">
{{ elt }} est impair
</li>
<ng-template #sinon>
<li>
{{ elt }} est pair
</li>
</ng-template>
</ng-container>
</ul>
45 / 102
Directives Angular *ngIf
Angular
Exercice
Utiliser les directives Angular pour afficher sous forme d’une liste
H
HTML les éléments du tableau moyennes: number[] = [18, 5,I ©
11, 15] avec le message suivant :
UEL
L MO
Si 0 ≤ valeur < 10 alors échec,
e f Emoyen,
13ralors
Si 10 ≤ valeur < h
Si 13 ≤©
Ac
valeur < 16 alors bien,
Sinon très bien.
46 / 102
Directives Angular *ngIf
Angular
Une solution possible
<ul>
<ng-container *ngFor="let elt of moyennes">
<li *ngIf="elt >= 0 && elt < 10; else moyen">
{{ elt }} : échec
</li>
<ng-template #moyen>
<li *ngIf="elt < 13; else bien">
{{ elt }} : moyen
H I ©
EL
</li>
</ng-template>
<ng-template #bien>
O U
LM
<li *ngIf="elt < 16; else tbien">
{{ elt }} : bien
</li>
</ng-template>
r e f E
<ng-template #tbien>
ch
©A
<li *ngIf="elt >= 16; else autre">
{{ elt }} : très bien
</li>
</ng-template>
<ng-template #autre>
<li>
autre
</li>
</ng-template>
</ng-container>
</ul>
47 / 102
Directives Angular *ngIf
Angular
*ngIf vs hidden
*ngIf commentera le contenu si la condition est fausse.
L’élément ne sera pas attaché au DOM.
[hidden] attachera l’élément au DOM et le marquera avec
l’attribut hidden.
48 / 102
Directives Angular ngSwitch
Angular
ngSwitch
49 / 102
Directives Angular ngSwitch
<ul>
<ng-container *ngFor="let elt of tab">
<ng-container [ngSwitch]="elt">
<li *ngSwitchCase="1">
{{ elt }} = un
</li>
<li *ngSwitchCase="2">
{{ elt }} = deux
H I ©
</li>
<li *ngSwitchCase="3">
UEL
O
LM
{{ elt }} = trois
</li>
e f
<li *ngSwitchDefault>
r E
ch
{{ elt }} : autre
©A
</li>
</ng-container>
</ng-container>
</ul>
50 / 102
Directives Angular ngSwitch
<ul>
<ng-container *ngFor="let elt of tab">
<ng-container [ngSwitch]="elt">
<li *ngSwitchCase="1">
{{ elt }} = un
</li>
<li *ngSwitchCase="2">
{{ elt }} = deux
</li>
<li *ngSwitchCase="3">
{{ elt }} = trois
</li>
<li *ngSwitchDefault>
{{ elt }} : autre
</li>
</ng-container>
</ng-container>
</ul>
Pour comparer avec une chaı̂ne de caractère, il faut ajouter les simples quotes (par exemple :
*ngSwitchCase="’bonjour’".
50 / 102
Directives Angular ngSwitch
Angular
51 / 102
Directives Angular ngSwitch
Angular
Solution
<ul>
<ng-container *ngFor="let elt of tab">
<ng-container [ngSwitch]="true">
<li *ngSwitchCase="elt >= 0 && elt < 10">
{{ elt }} : échec
</li>
<li *ngSwitchCase="elt >= 10 && elt < 13">
{{ elt }} : moyen
</li>
<li *ngSwitchCase="elt >= 13 && elt < 16">
{{ elt }} : bien
</li>
<li *ngSwitchCase="elt >= 16">
{{ elt }} : très bien
</li>
<li *ngSwitchDefault>
autre
</li>
</ng-container>
</ng-container>
</ul>
52 / 102
Directives Angular ngSwitch
<ul>
<ng-container *ngFor="let elt of moyennes">
<ng-container [ngSwitch]="true">
<li *ngSwitchCase="elt >= 0 && elt < 10">
{{ elt }} : échec
</li>
<li *ngSwitchCase="elt < 13">
{{ elt }} : moyen
</li>
<li *ngSwitchCase="elt < 16">
{{ elt }} : bien
</li>
<li *ngSwitchCase="elt >= 16">
{{ elt }} : très bien
</li>
<li *ngSwitchDefault>
autre
</li>
</ng-container>
</ng-container>
</ul>
53 / 102
Directives Angular ngSwitch
Angular
Remarques
Quand c’est possible, on préfère déplacer la logique de calcul dans les fichiers
TypeScript (*.component.ts).
54 / 102
Directives Angular ngPlural
Angular
ngPlural
Introduit dans Angular 10. H I ©
UEL
O
Similaire à ngSwitch mais n’acceptant que des valeurs
numériques.
f E LM
r e
h le cas par défaut, mais on peut utiliser la
Pas de mot-clécpour
©
constante A
other.
55 / 102
Directives Angular ngPlural
Angular
Exemple avec ngPlural
<ul>
<ng-container *ngFor="let elt of tab">
<li>
<ng-container [ngPlural]="elt">
<ng-template ngPluralCase="1">
{{ elt }} : un
</ng-template>
<ng-template ngPluralCase="2">
{{ elt }} : deux
</ng-template>
<ng-template ngPluralCase="3">
{{ elt }} : trois
</ng-template>
<ng-template ngPluralCase="other">
{{ elt }} : autre
</ng-template>
</ng-container>
</li>
</ng-container>
</ul>
56 / 102
Directives Angular ngStyle
Angular
ngStyle
57 / 102
Directives Angular ngStyle
Angular
ngStyle
Remarque
57 / 102
Directives Angular ngStyle
Angular
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
// le contenu précédent
couleur = 'white';
couleurBg = 'red';
}
58 / 102
Directives Angular ngStyle
Angular
Pour attribuer une valeur à la propriété CSS d’une balise
<p [style.background-color]='couleurBg'>
{{ title }}
</p>
59 / 102
Directives Angular ngStyle
Angular
Pour attribuer une valeur à la propriété CSS d’une balise
<p [style.background-color]='couleurBg'>
{{ title }}
</p>
59 / 102
Directives Angular ngStyle
Angular
Pour attribuer une valeur à la propriété CSS d’une balise
<p [style.background-color]='couleurBg'>
{{ title }}
</p>
Remarque
59 / 102
Directives Angular ngStyle
Angular
ngStyle
permet de modifier le style d’un élément HTML.
s’utilise conjointement avec le property binding pour récupérer
des valeurs définies dans la classe.
60 / 102
Directives Angular ngStyle
Angular
61 / 102
Directives Angular ngStyle
Angular
<p [ngStyle]="monStyle">
{{ title }}
</p>
62 / 102
Directives Angular ngStyle
Angular
<p [ngStyle]="monStyle">
{{ title }}
</p>
62 / 102
Directives Angular ngStyle
Angular
Il est possible de définir des méthodes dans app.component.ts qui gèrent le
style d’un élément HTML
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
// le contenu précédent
getColor(): string {
return 'white';
}
getBgColor(): string {
return 'red';
}
}
63 / 102
Directives Angular ngStyle
Angular
Pour afficher le contenu de l’attribut nom dans le template avec une couleur de
fond rouge
64 / 102
Directives Angular ngClass
Angular
ngClass
65 / 102
Directives Angular ngClass
Angular
ngClass
Remarque
65 / 102
Directives Angular ngClass
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
// le contenu précédent
}
66 / 102
Directives Angular ngClass
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
// le contenu précédent
}
66 / 102
Directives Angular ngClass
Angular
Pour associer la classe rouge à la balise <p>
<p [ngClass]="{ 'rouge': true }">
{{ title }}
</p>
67 / 102
Directives Angular ngClass
Angular
Pour associer la classe rouge à la balise <p>
<p [ngClass]="{ 'rouge': true }">
{{ title }}
</p>
67 / 102
Directives Angular ngClass
Angular
Pour associer la classe rouge à la balise <p>
<p [ngClass]="{ 'rouge': true }">
{{ title }}
</p>
67 / 102
Directives Angular ngClass
Angular
Ainsi, on peut faire aussi un affichage conditionnel
68 / 102
Directives Angular ngClass
Angular
Ainsi, on peut faire aussi un affichage conditionnel
Ou encore (le paragraphe sera affiché en rouge si nom contient wick, en bleu sinon)
68 / 102
Directives Angular ngClass
Angular
Ainsi, on peut faire aussi un affichage conditionnel
Ou encore (le paragraphe sera affiché en rouge si nom contient wick, en bleu sinon)
68 / 102
Directives Angular ngClass
Angular
69 / 102
Directives Angular ngClass
Angular
Exercice
Utiliser ngClass pour afficher en bleu les éléments pairs du tableau
précédent (tab) et en rouge les éléments impairs.
70 / 102
Directives Angular ngClass
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of tab">
<li [ngClass]="{'rouge': elt % 2 != 0, 'bleu': elt % 2 == 0}">
{{ elt }}
</li>
</ng-container>
</ul>
71 / 102
Directives Angular ngClass
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of tab">
<li [ngClass]="{'rouge': elt % 2 != 0, 'bleu': elt % 2 == 0}">
{{ elt }}
</li>
</ng-container>
</ul>
Deuxième solution
<ul>
<ng-container *ngFor="let elt of tab">
<li [ngClass]="elt % 2 == 0 ? 'bleu' : 'rouge'">
{{ elt }}
</li>
</ng-container>
</ul>
71 / 102
Directives Angular ngClass
Angular
Troisième solution
<ul>
<ng-container *ngFor="let elt of tab">
<li [ngClass]="{'rouge': !estPair(elt), 'bleu':
estPair(elt)}">
{{ elt }}
</li>
</ng-container>
</ul>
72 / 102
Directives Angular ngClass
Angular
Troisième solution
<ul>
<ng-container *ngFor="let elt of tab">
<li [ngClass]="{'rouge': !estPair(elt), 'bleu':
estPair(elt)}">
{{ elt }}
</li>
</ng-container>
</ul>
72 / 102
Directives Angular ngClass
Angular
Considérons la liste stagiaires précédente
stagiaires: Array<Stagiaire> = [
new Stagiaire(100, 'Wick', 'John'),
new Stagiaire(101, 'Abruzzi', 'John'),
new Stagiaire(102, 'Marley', 'Bob'),
new Stagiaire(103, 'Segal', 'Steven')
];
73 / 102
Directives Angular ngClass
Angular
Considérons la liste stagiaires précédente
stagiaires: Array<Stagiaire> = [
new Stagiaire(100, 'Wick', 'John'),
new Stagiaire(101, 'Abruzzi', 'John'),
new Stagiaire(102, 'Marley', 'Bob'),
new Stagiaire(103, 'Segal', 'Steven')
];
Exercice
Écrire un script Angular qui permet d’afficher dans une liste HTML les
éléments du tableau stagiaires (afficher uniquement nom et prénom). Les
éléments d’indice pair seront affichés en rouge, les impairs en bleu.
73 / 102
Directives Angular ngClass
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of stagiaires; let isEven =
even; let isOdd = odd">
<li [ngClass]="{'rouge': isEven,'bleu': isOdd}">
{{ elt.nom }} {{ elt.prenom }}
</li>
</ng-container>
</ul>
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of stagiaires; let isEven =
even; let isOdd = odd">
<li [ngClass]="{'rouge': isEven,'bleu': isOdd}">
{{ elt.nom }} {{ elt.prenom }}
</li>
</ng-container>
</ul>
Deuxième solution
<ul>
<ng-container *ngFor="let elt of stagiaires; let i = index;">
<li [ngClass]="i % 2 != 0 ? 'rouge' : 'bleu'">
{{ elt.nom + " " + elt.prenom }}
</li>
</ng-container>
</ul>
Angular
Troisième solution
<ul>
<ng-container *ngFor="let stagiaire of stagiaires">
<li [ngStyle]="{color: getNextColor()}">
{{ stagiaire.prenom }} {{ stagiaire. nom }}
</li>
</ng-container>
</ul>
75 / 102
Directives Angular ngClass
Angular
Troisième solution
<ul>
<ng-container *ngFor="let stagiaire of stagiaires">
<li [ngStyle]="{color: getNextColor()}">
{{ stagiaire.prenom }} {{ stagiaire. nom }}
</li>
</ng-container>
</ul>
couleur = 'blue';
getNextColor(): string {
this.couleur = this.couleur === 'red' ? 'blue' : 'red';
return this.couleur;
}
75 / 102
Control Flow Syntax
Angular
76 / 102
Control Flow Syntax
Angular
77 / 102
Control Flow Syntax @for
Angular
Afficher les éléments du tableau tab en utilisant *ngFor
<ul>
@for (elt of tab; track elt) {
<li> {{ elt }} </li>
}
</ul>
78 / 102
Control Flow Syntax @for
Angular
Afficher les éléments du tableau tab en utilisant *ngFor
<ul>
@for (elt of tab; track elt) {
<li> {{ elt }} </li>
}
</ul>
track elt
permet de spécifier la clé utilisée pour associer les éléments du tableau aux
vues dans le DOM.
78 / 102
Control Flow Syntax @for
Angular
<ul>
@for (elt of tab; track elt) {
<li>{{ $index }} {{ elt }} </li>
}
</ul>
79 / 102
Control Flow Syntax @for
Angular
<ul>
@for (elt of tab; track elt) {
<li>{{ $index }} {{ elt }} </li>
}
</ul>
ou
<ul>
@for (elt of tab; let i = $index; track i) {
<li>{{ i }} {{ elt }} </li>
}
</ul>
79 / 102
Control Flow Syntax @for
Angular
$first : retourne true si l’élément courant est le premier de la liste, false sinon.
$last : retourne true si l’élément courant est le dernier de la liste, false sinon.
$even : retourne true si l’indice de l’élément courant est pair, false sinon.
$odd : retourne true si l’indice de l’élément courant est impair, false sinon.
80 / 102
Control Flow Syntax @for
Angular
<ul>
@for (elt of tab; let i = $index; let premier = $first ;
track i) {
<li>{{ first }} {{ i }} {{ elt }} </li>
}
</ul>
81 / 102
Control Flow Syntax @empty
Angular
82 / 102
Control Flow Syntax @empty
Angular
Angular
Exercice
Écrire un script Angular qui permet d’afficher dans une liste HTML les nom
et prénom de chaque stagiaire de la liste stagiaires.
83 / 102
Control Flow Syntax @empty
Angular
Solution
<ul>
@for (st of stagiaires; track st.num) {
<li> {{ st.prenom }} {{ st.nom }} </li>
}
</ul>
84 / 102
Control Flow Syntax @empty
Angular
Remarques
@for nous permet d’itérer sur les tableaux, mais pas sur les objets.
85 / 102
Control Flow Syntax @empty
Angular
<ul>
@for (st of stagiaires; track st.num) {
@for (elt of st | keyvalue ; track elt) {
<li> {{ elt.key }} {{ elt.value }}</li>
}
}
</ul>
86 / 102
Control Flow Syntax @if
Angular
87 / 102
Control Flow Syntax @else
Angular
88 / 102
Control Flow Syntax @else
Angular
Exercice
Utiliser les Control Flow Syntax d’Angular pour afficher sous forme
d’une liste HTML les éléments du tableau moyennes: number[] =
[18, 5, 11, 15] avec le message suivant :
Si 0 ≤ valeur < 10 alors échec,
Si 10 ≤ valeur < 13 alors moyen,
Si 13 ≤ valeur < 16 alors bien,
Sinon très bien.
89 / 102
Control Flow Syntax @switch
Angular
Exemple avec @switch
<ul>
@for(elt of tab; track $index) {
<li>
@switch(elt) {
@case(1) {
{{ elt }} = un
}
@case(2) {
{{ elt }} = deux
}
@case(3) {
{{ elt }} = trois
}
@default {
{{ elt }} = autre
}
}
</li>
}
</ul>
90 / 102
Control Flow Syntax @switch
Angular
91 / 102
Valeurs réactives
Angular
Créons le composant reactive.component.ts avec le code suivant
92 / 102
Valeurs réactives
Angular
Créons le composant reactive.component.ts avec le code suivant
<p>
{{ value1 }} + {{ value2 }} = {{ resultat }}
</p>
Angular
Question
93 / 102
Valeurs réactives
Angular
Question
5 secondes plus tard, 3 sera remplacé 5 secondes plus tard, 3 est remplacé par
par 13 13
93 / 102
Valeurs réactives
Angular
Conclusion
94 / 102
Valeurs réactives
Angular
Conclusion
Solution
94 / 102
Valeurs réactives
Angular
Conclusion
Solution
Signal
une enveloppe autour d’une valeur qui peut informer les consommateurs intéressés
lorsque cette valeur change.
94 / 102
Valeurs réactives
Angular
95 / 102
Valeurs réactives signal
Angular
Commençons par initialiser value1 et value2 avec la fonction signal
value1 = signal(2)
value2 = signal(5)
96 / 102
Valeurs réactives signal
Angular
Commençons par initialiser value1 et value2 avec la fonction signal
value1 = signal(2)
value2 = signal(5)
Remarque
96 / 102
Valeurs réactives signal
Angular
Commençons par initialiser value1 et value2 avec la fonction signal
value1 = signal(2)
value2 = signal(5)
Remarque
96 / 102
Valeurs réactives signal
Angular
97 / 102
Valeurs réactives signal
Angular
Remarque
resultat est de type Signal<number> donc il est en lecture-seule.
97 / 102
Valeurs réactives computed
Angular
Dans le constructeur, utilisons update pour modifier value1 et computed pour recalculer
la valeur de resultat après chaque changement de valeur de value1 ou value2
constructor() {
setInterval(
() => this.value1.update(val => val += 10),
2000
)
this.resultat = computed(() => this.value1() + this.value2())
}
98 / 102
Valeurs réactives computed
Angular
Dans le constructeur, utilisons update pour modifier value1 et computed pour recalculer
la valeur de resultat après chaque changement de valeur de value1 ou value2
constructor() {
setInterval(
() => this.value1.update(val => val += 10),
2000
)
this.resultat = computed(() => this.value1() + this.value2())
}
98 / 102
Valeurs réactives computed
Angular
Pour accéder aux valeurs d’un signal, on utilise le getter (on rajoute donc les
parenthèses)
<p>
{{ value1() }} + {{ value2() }} = {{ resultat() }}
</p>
99 / 102
Valeurs réactives effect
Angular
100 / 102
Valeurs réactives effect
Angular
Remarque
effect observe resultat et value1. Le changement de valeur de tout autre signal ne permettra pas de le déclencher.
100 / 102
Valeurs réactives effect
Angular
101 / 102
Valeurs réactives effect
Angular
r = effect((onCleanup) => {
console.log('effet', this.value1(), this.resultat())
onCleanup(() => {
console.log("Traitement appliqué à la destruction de l'effect");
});
})
102 / 102