Cours Angular Introduction
Cours Angular Introduction
Cours Angular Introduction
Achref El Mouelhi
elmouelhi.achref@gmail.com
Angular
Angular
Angular
Angular utilise :
H I ©
les composants web
UEL
O
l’injection de dépendance
f E LM
le DOM Virtuel
ch r e
©A
le change detection
Angular
Injection de dépendance ?
H I ©
concept connu en programmation orientéeE
U L
objet.
utilisé par plusieurs frameworksM O (Spring, Symfony...).
f E L Back-End
h e
consistant à utiliserrdes classes sans faire de l’instanciation
statique. Ac
©
Angular
DOM Virtuel ?
H I ©
introduit par la librairie React.
UEL
O
f E LM
une représentation en mémoire du DOM physique.
ch r e
les modifications se font sur ce DOM virtuel ensuite Angular
©A
s’occupe de les synchroniser vers le DOM physique.
Angular
Change detection ?
npm (node package manager) : le gestionnaire de paquets par défaut pour une
application JavaScript.
angular-cli command line interface : outil proposé par Google pour faciliter la création et
H I ©
la construction d’une application Angular en exécutant directement des commandes.
bundles.
r e f E
regroupe des ressources de même nature (.js ou .css...) dans un ou plusieurs
ch
©A
fonctionne avec un système de module : un fichier JS est un module, un fichier CSS
est un module...
Angular
H I ©
Angular 6 présenté en mai 2018
U EL
O
LM
Angular 7 présenté en octobre 2018
f
Angular 8 présenté en mai 2019
r e E
ch
©A
Angular 9 présenté en février 2020
H I ©
Angular 6 présenté en mai 2018
U EL
O
LM
Angular 7 présenté en octobre 2018
f
Angular 8 présenté en mai 2019
r e E
ch
©A
Angular 9 présenté en février 2020
https://www.madewithangular.com/
Angular
Remarque
Pour installer Angular, il faut télécharger et installer NodeJS (Dernière version stable
LTS)
H I ©
U EL
O
f E LM
ch r e
©A
Angular
Remarque
Pour installer Angular, il faut télécharger et installer NodeJS (Dernière version stable
LTS)
H I ©
U EL
O
Pour installer Angular, exécuter la commande
f E LM
npm install -g @angular/cli
ch r e
©A
Angular
Remarque
Pour installer Angular, il faut télécharger et installer NodeJS (Dernière version stable
LTS)
H I ©
U EL
O
Pour installer Angular, exécuter la commande
f E LM
npm install -g @angular/cli
ch r e
©A
Pour installer une version bien précise (par exemple 6.1.0)
Angular
Angular
Angular
Quel IDE (Environnement de développement intégré) ?
Eclipse
...
H I ©
U EL
O
f E LM
ch r e
©A
Angular
Quel IDE (Environnement de développement intégré) ?
Eclipse
...
H I ©
U EL
O
f E LM
ch r e
Visual Studio Code (ou VSC) , pourquoi ?
©A
Gratuit.
Offrant la possibilité d’intégrer des éditeurs de texte connus (comme Sublime Text,
Atom...).
Angular
Angular
Angular
H I ©
UEL
O
f E LM
ch r e
©A
Angular
H I ©
UEL
O
f E LM
Depuis la version 7, il faut aussi répondre aux questions suivantes
ch r e
Do you want to enforce stricter type checking and stricter bundle
©A
budgets in the workspace ? ? (Yes)
Would you like to add Angular routing ? (Yes)
Which stylesheet format would you like to use ? (CSS)
Angular
H I ©
UEL
O
f E LM
ch r e
©A
Angular
H I ©
UEL
Pour lancer le projet et ouvrir une nouvelle fenêtre dans le navigateur,
O
exécuter la commande
f E LM
ng serve --open
ch r e
©A
Angular
H I ©
UEL
Pour lancer le projet et ouvrir une nouvelle fenêtre dans le navigateur,
O
exécuter la commande
f E LM
ng serve --open
ch r e
©A
On peut aussi lancer un projet Angular comme tout projet NodeJS,
exécuter la commande
npm start
Angular
Arborescence d’un projet Angular
.angular-cli.json r
c h e
(ou angular.json depuis la version 6) : contenant les
©A
données concernant la configuration du projet (l’emplacement des fichiers de
démarrage...)
Angular
Que contient src ?
assets : l’unique dossier accessible aux visiteurs et contenant les images, les sons...
index.html : l’unique fichier HTML d’une application Angular
styles.css : la feuille de style commune de tous les composants web de l’application
favicon.ico : le logo d’Angular
H I ©
app : contient initialement les 5 fichiers du module principal
UEL
O
LM
app.module.ts : la classe correspondante au module principal
r e f E
app.component.ts : la classe associé au composant web
ch
app.component.html : le fichier contenant le code HTML
©A
associé au composant web
app.component.css : le fichier contenant le code CSS associé
au composant web
app.component.spec.ts : le fichier de test du composant web
Angular
Que contient src ?
assets : l’unique dossier accessible aux visiteurs et contenant les images, les sons...
index.html : l’unique fichier HTML d’une application Angular
styles.css : la feuille de style commune de tous les composants web de l’application
favicon.ico : le logo d’Angular
H I ©
app : contient initialement les 5 fichiers du module principal
UEL
O
LM
app.module.ts : la classe correspondante au module principal
r e f E
app.component.ts : la classe associé au composant web
ch
app.component.html : le fichier contenant le code HTML
©A
associé au composant web
app.component.css : le fichier contenant le code CSS associé
au composant web
app.component.spec.ts : le fichier de test du composant web
Pour créer un projet sans les fichiers de test (.spec.ts), utiliser la commande ng new
ProjectName --skip-tests=true
Angular
Contenu d’index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>ProjectName</title>
H I ©
<!-- cette balise va permettre d’assurerE
U Lroutage -->
le
<base href="/">
L MO
r e f E
<meta name="viewport" content="width=device-width, initial-
scale=1">
A h
ctype="image/x-icon"
</head> ©
<link rel="icon" href="favicon.ico">
<body>
Contenu de app.module.ts
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule
],
H I ©
EL
providers: [],
})
bootstrap: [AppComponent]
O U
export class AppModule { }
f E LM
ch r e
©A
Contenu de app.module.ts
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule
],
H I ©
EL
providers: [],
})
bootstrap: [AppComponent]
O U
export class AppModule { }
f E LM
ch r e
Explication
©A
@NgModule : pour déclarer cette classe comme module
declarations : dans cette section, on déclare les composants de ce module
imports : dans cette section, on déclare les modules nécessaires pour le module
providers : dans cette section, on déclare les services qui seront utilisés dans le module
bootstrap : dans cette section, on déclare le composant principal de ce module
Angular
H I ©
UEL
O
f E LM
ch r e
©A
Angular
H I ©
UEL
O
f E LM
ch r e
©A
ch r e
selector : pour définir le nom de balise correspondant à ce composant web
©A
templateUrl : pour indiquer le fichier contenant le code HTML correspondant au
composant web
styleUrls : pour indiquer le(s) fichier(s) contenant le code CSS correspondant au
composant web
ch r e
selector : pour définir le nom de balise correspondant à ce composant web
©A
templateUrl : pour indiquer le fichier contenant le code HTML correspondant au
composant web
styleUrls : pour indiquer le(s) fichier(s) contenant le code CSS correspondant au
composant web
{{ Interpolation }}
Angular
Objectif : afficher les attributs et les valeurs sous forme d’une liste
HTML
Créer un répertoire classes dans app où on va placer toutes les
H I ©
classes
U EL
O
f E LM
Créer une première classe Personne ayant les attributs num, nom
et prénom
ch r e
©A
Créer un objet de cette classe dans app.component.ts
Afficher les valeurs de cet objet sous forme de liste dans
app.component.html
Angular
On peut aussi utiliser la commande
ng generate class classes/personne
H I ©
U EL
O
f E LM
ch r e
©A
Angular
On peut aussi utiliser la commande
ng generate class classes/personne
H I ©
EL
OU
Pour générer une classe sans le fichier de test (.spec.ts)
M
E L
ng generate class classes/personne
f --skipTests=true
chr e
© A
Angular
On peut aussi utiliser la commande
ng generate class classes/personne
H I ©
EL
OU
Pour générer une classe sans le fichier de test (.spec.ts)
M
E L
ng generate class classes/personne
f --skipTests=true
chr e
© A
Remarque
Contenu de personne.ts
©A
this._nom = _nom;
}
get prenom(): string | undefined {
return this._prenom;
}
set prenom(_prenom: string | undefined) {
this._prenom = _prenom;
}
}
Angular
Créer un objet de type Personne dans app.component.ts
import { Component } from ’@angular/core’;
import { Personne } from ’./classes/personne’;
@Component({
H I ©
selector: ’app-root’,
U EL
templateUrl: ’./app.component.html’,
O
styleUrls: [’./app.component.css’]
f E LM
})
ch r e
©A
export class AppComponent {
title = ’cours-angular’;
personne: Personne = new Personne(100, ’Wick’, ’
John’);
constructor() {
}
}
H & H: Research and Training 28 / 70
Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation
Angular
f
<li> Prénom : {{ personne.prenom }} </li>
r e E
</ul>
ch
©A
Angular
L’écriture suivante
{{ personne }}
H I ©
U EL
O
f E LM
ch r e
©A
Angular
L’écriture suivante
{{ personne }}
affiche
H I ©
[object Object]
U EL
O
f E LM
ch r e
©A
Angular
L’écriture suivante
{{ personne }}
affiche
H I ©
[object Object]
U EL
O
f E LM
ch r e
On peut utiliser un pipe pour affiche un objet au format JSON
{{ personne | json }}©A
Angular
L’écriture suivante
{{ personne }}
affiche
H I ©
[object Object]
U EL
O
f E LM
ch r e
On peut utiliser un pipe pour affiche un objet au format JSON
{{ personne | json }}©A
Le résultat est
{ "_num": 100, "_nom": "Wick", "_prenom": "John" }
Angular
O U
f E LM
ch r e
©A
O U
LM
Remarques
O U
LM
Remarques
Solution
utiliser les directives (section suivante)
H & H: Research and Training 32 / 70
Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation
Angular
Ajouter une méthode direBonjour() dans app.component.ts
ch r e
personne: Personne = new Personne(’Wick’, ’John’);
©A
tab: number[] = [2, 3, 5, 8];
constructor() {
}
direBonjour(): string {
return ’bonjour Angular’;
}
}
Angular
H I ©
Appeler la méthode direBonjour() dans app.component.html
U EL
O
<p>{{ direBonjour() }}</p>
f E LM
ch r e
©A
Angular
H I ©
U EL
O
f E LM
ch r e
©A
Angular
H I ©
On peut aussi faire le one way binding en utilisant laE
U L
propriété JavaScript
textContent
L MO
<p [textContent]=title></p>
r e f E
A ch
©
Angular
H I ©
On peut aussi faire le one way binding en utilisant laE
U L
propriété JavaScript
textContent
L MO
<p [textContent]=title></p>
r e f E
A ch
©
[ one way binding ] ou [ property binding ]
[property] = ’value’ : permet de remplacer value par sa valeur dans la
classe app.component.ts
Angular
Plusieurs directives possibles
*ngFor
*ngIf
H I ©
*ngSwitch
UEL
O
ngStyle
f E LM
ngClass
ch r e
©A
Angular
Plusieurs directives possibles
*ngFor
*ngIf
H I ©
*ngSwitch
UEL
O
ngStyle
f E LM
ngClass
ch r e
©A
Ces directives s’utilisent conjointement avec les composants web suivant
ng-container
ng-template
Angular
*ngFor
H I ©
EL
OU
permet de répéter un traitement (affichage d’un élément HTML)
M
s’utilise comme un attributE
f Lbalise et sa valeur est une
de
e
instruction itérative rTypeScript
ch
© A
Angular
Angular
Et pour avoir l’indice de l’itération courante
<ul>
<li *ngFor="let elt of tab; let i = index">
{{ i }} : {{ elt }}
</li>
H I ©
</ul>
UEL
O
f E LM
ch r e
©A
Angular
Et pour avoir l’indice de l’itération courante
<ul>
<li *ngFor="let elt of tab; let i = index">
{{ i }} : {{ elt }}
</li>
H I ©
</ul>
UEL
O
f E LM
ou ch r e
<ul> ©A
<li *ngFor="let elt of tab; index as i">
{{ i }} : {{ elt }}
</li>
</ul>
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 }}
H I ©
</li>
UEL
</ul>
O
f E LM
ch r e
©A
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 }}
H I ©
</li>
UEL
</ul>
O
f E LM
ch r e
©A
Autres paramètres possible
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.
Angular
r e f E
ch
©A
Angular
r e f E
ch
Exercice
©A
Écrire un script Angular qui permet d’afficher dans une liste HTML les nom
et prénom de chaque personne de la liste personnes .
Angular
Angular
Exercice
H I ©
UEL
O
Écrire un code HTML, en utilisant les directives Angular, qui permet
f E LM
d’afficher le premier élément du tableau (tab) ainsi que sa parité (pair
ou impair).
ch r e
©A
Angular
Angular
Une deuxième solution avec *ngIf, then et else
<ul>
<li *ngIf="tab[0] % 2 != 0; then si else sinon">
Ce code ne sera jamais pris en compte
</li>
H I ©
<ng-template #si>
UEL
<li>
O
{{ tab[0] }} est impair
</li>
f E LM
</ng-template>
ch r e
©A
<ng-template #sinon>
<li>
{{ tab[0] }} est pair
</li>
</ng-template>
</ul>
Angular
Exercice
H I ©
UEL
O
Écrire un code HTML, en utilisant les directives Angular, qui permet
f E LM
d’afficher sous forme d’une liste chaque élément du tableau précédent
(tab) ainsi que sa parité.
ch r e
©A
Angular
Solution
<ul>
<ng-container *ngFor="let elt of tab">
<li *ngIf="elt % 2 != 0; else sinon">
H I ©
{{ elt }} est impair
UEL
</li>
O
<ng-template #sinon>
f E LM
<li>
ch r e
©A
{{ elt }} est pair
</li>
</ng-template>
</ng-container>
</ul>
Angular
Exercice
Angular
Exemple avec ngSwitch
<ul>
<ng-container *ngFor="let elt of tab">
<ng-container [ngSwitch]="elt">
<li *ngSwitchCase="1">
{{ elt }} = un
</li>
H I ©
<li *ngSwitchCase="2">
UEL
{{ elt }} = deux
O
LM
</li>
<li *ngSwitchCase="3">
{{ elt }} = trois
r e f E
</li>
ch
©A
<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’".
H & H: Research and Training 49 / 70
Directives Angular ngSwitch
Angular
Angular
Solution
<ul>
<ng-container *ngFor="let elt of tab">
<ng-container [ngSwitch]="true">
<li *ngSwitchCase="elt >= 0 && elt < 10">
{{ elt }} : échec
</li>
H I ©
<li *ngSwitchCase="elt >= 10 && elt < 13">
{{ elt }} : moyen
UEL
O
LM
</li>
{{ elt }} : bien
r e E
<li *ngSwitchCase="elt >= 13 && elt < 15">
f
</li>
ch
©A
<li *ngSwitchCase="elt >= 15">
{{ elt }} : très bien
</li>
<li *ngSwitchDefault>
autre
</li>
</ng-container>
</ng-container>
</ul>
Angular
Remarques
H I ©
U
*ngFor nous permet d’itérer sur un tableau, ELmais non pas sur un
objet.
L MO
f
Il est possible d’itéreresur
r E
un objet après avoir défini un pipe qui
h
c un objet en tableau.
©A
convertit virtuellement
Angular
ngStyle
H I ©
EL
OU
permet de modifier le style d’un élément HTML.
M
E
s’utilise conjointement avec
f Lproperty binding pour récupérer
le
c h
des valeurs définiesr e
dans la classe.
©A
Angular
Considérons le contenu suivant de app.component.ts
import { Component } from ’@angular/core’;
@Component({
selector: ’app-root’,
templateUrl: ’./app.component.html’,
H I ©
styleUrls: [’./app.component.css’]
UEL
})
O
export class AppComponent {
nom = ’wick’;
f E LM
couleur = ’blue’;
ch r e
©A
// le contenu précédent
}
Angular
Considérons le contenu suivant de app.component.ts
import { Component } from ’@angular/core’;
@Component({
selector: ’app-root’,
templateUrl: ’./app.component.html’,
H I ©
styleUrls: [’./app.component.css’]
UEL
})
O
export class AppComponent {
nom = ’wick’;
f E LM
couleur = ’blue’;
ch r e
©A
// le contenu précédent
}
Pour afficher le contenu de l’attribut nom dans le template avec une couleur de
fond rouge
<p [textContent]=nom [ngStyle]="{backgroundColor: ’red’}"></p>
Angular
Angular
Il est possible de définir des méthodes dans app.component.ts qui gèrent le
style d’un élement HTML
import { Component } from ’@angular/core’;
@Component({
selector: ’app-root’,
H I ©
templateUrl: ’./app.component.html’,
UEL
styleUrls: [’./app.component.css’]
O
})
export class AppComponent {
f E LM
// le contenu précédent
ch r e
©A
getColor(): string {
return ’white’;
}
getBackgroundColor(): string {
return ’red’;
}
}
Angular
Angular
ngClass
H I ©
EL
OU
permet d’attribuer de nouvelles classes d’un élément HTML.
M
Ela leLclasse
s’utilise conjointement avec
des valeurs définiesre f property binding pour récupérer
©A
Angular
Considérons le contenu suivant de app.component.ts
@Component({
selector: ’app-root’,
templateUrl: ’./app.component.html’,
styleUrls: [’./app.component.css’]
H I ©
})
UEL
export class AppComponent {
O
LM
// le contenu précédent
}
r e f E
ch
©A
Angular
Considérons le contenu suivant de app.component.ts
@Component({
selector: ’app-root’,
templateUrl: ’./app.component.html’,
styleUrls: [’./app.component.css’]
H I ©
})
UEL
export class AppComponent {
O
LM
// le contenu précédent
}
r e f E
ch
©A
On définit deux classes rouge et bleu dans app.component.css
.rouge {
color: red;
}
.bleu {
color: blue;
}
Angular
Pour associer la classe rouge à la balise <p>
<p [ngClass]="{’rouge’: true}">
{{ nom }}
</p>
H I ©
UEL
O
f E LM
ch r e
©A
Angular
Pour associer la classe rouge à la balise <p>
<p [ngClass]="{’rouge’: true}">
{{ nom }}
</p>
H I ©
U
On peut aussi appeler une méthode dans la directive
L
EngClass
L MO
<p [ngClass]="{’rouge’: afficherEnRouge()}">
{{ nom }}
r e f E
</p>
A ch
©
Angular
Pour associer la classe rouge à la balise <p>
<p [ngClass]="{’rouge’: true}">
{{ nom }}
</p>
H I ©
U
On peut aussi appeler une méthode dans la directive
L
EngClass
L MO
<p [ngClass]="{’rouge’: afficherEnRouge()}">
{{ nom }}
r e f E
</p>
A ch
©
Définissons la méthode dans app.component.ts
afficherEnRouge(): boolean {
return this.couleur === ’blue’ ? true : false;
}
Angular
Angular
Angular
Angular
Exercice
H I ©
UEL
O
Utiliser ngClass dans un code HTML permettant d’afficher en bleu
f E LM
les éléments pairs du tableau précédent (tab) et en rouge les
éléments impairs.
ch r e
©A
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of tab">
<li [ngClass]="{’rouge’: elt % 2 != 0, ’bleu’: elt % 2 ==
0}">
{{ elt }}
H I ©
EL
</li>
</ng-container>
O U
LM
</ul>
r e f E
ch
©A
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of tab">
<li [ngClass]="{’rouge’: elt % 2 != 0, ’bleu’: elt % 2 ==
0}">
{{ elt }}
H I ©
EL
</li>
</ng-container>
O U
LM
</ul>
r e f E
Deuxième solution
ch
<ul> ©A
<ng-container *ngFor="let elt of tab">
<li [ngClass]="elt % 2 == 0 ? ’bleu’ : ’rouge’">
{{ elt }}
</li>
</ng-container>
</ul>
Angular
Troisième solution
<ul>
<ng-container *ngFor="let elt of tab">
<li *ngIf="elt%2==0" [ngClass]="{’rouge’: !estPair(
elt), ’bleu’: estPair(elt)}">
H I ©
{{ elt }}
</li> UEL
O
</ng-container>
</ul>
f E LM
ch r e
©A
Angular
Troisième solution
<ul>
<ng-container *ngFor="let elt of tab">
<li *ngIf="elt%2==0" [ngClass]="{’rouge’: !estPair(
elt), ’bleu’: estPair(elt)}">
H I ©
{{ elt }}
</li> UEL
O
</ng-container>
</ul>
f E LM
ch r e
© A
Dans app.component.ts, on définit la méthode estPair
estPair(elt: number): boolean {
return elt % 2 === 0;
}
Angular
Angular
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of personnes; let isEven = even
; let isOdd = odd">
<li [ngClass]="{’rouge’: isEven,’bleu’: isOdd}">
{{ elt.nom }} {{ elt.prenom }}
H I ©
EL
</li>
</ng-container>
O U
LM
</ul>
r e f E
ch
©A
Angular
Première solution
<ul>
<ng-container *ngFor="let elt of personnes; let isEven = even
; let isOdd = odd">
<li [ngClass]="{’rouge’: isEven,’bleu’: isOdd}">
{{ elt.nom }} {{ elt.prenom }}
H I ©
EL
</li>
</ng-container>
O U
LM
</ul>
r e f E
Deuxième solution
ch
<ul> ©A
<ng-container *ngFor="let elt of personnes; 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 personne of personnes">
<li [ngStyle]="{color: getNextColor()}">
{{ personne.prenom }} {{ personne. nom }}
</li>
H I ©
</ng-container>
UEL
</ul> O
f E LM
ch r e
©A
Angular
Troisième solution
<ul>
<ng-container *ngFor="let personne of personnes">
<li [ngStyle]="{color: getNextColor()}">
{{ personne.prenom }} {{ personne. nom }}
</li>
H I ©
</ng-container>
UEL
</ul> O
f E LM
r e
ch on définit la méthode getNextColor
A
Dans app.component.ts,
©
couleur = ’blue’;
getNextColor(): string {
this.couleur = this.couleur === ’red’ ? ’blue’ : ’red’;
return this.couleur;
}
Angular
H I ©
UEL
O
f E LM
ch r e
©A
Angular
H I ©
UEL
O
LM
Pour vider le cache
r
# À partir de la version 5 de NPM
e f E
ch
©A
npm cache verify
# Avant la version 5
npm cache clean
Angular
H I ©
EL
ng update @angular/cli @angular/core
O U
f E LM
ch r e
©A
Angular
H I ©
EL
ng update @angular/cli @angular/core
O U
f E LM
r e
Pour mettre à jour tous les paquets définis dans Package.json
ch
©A
ng update @angular/cli @angular/core --all=true