Vous êtes sur la page 1sur 108

Angular : introduction

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 70


Plan
1 Introduction
2 Installation
3 Création et structure d’un projet
4 Affichage d’attribut (de type objet ou tableau) ou méthode
Interpolation
One way binding
5 Directives Angular
*ngFor
*ngIf
ngSwitch
ngStyle
ngClass
6 Commandes utiles

H & H: Research and Training 2 / 70


Introduction

Angular

Angular

Framework JavaScript (ou TypeScript)


H I ©
Open-source
U EL
M O
f E L
Présenté par Google en 2009
e
chrdes applications web et mobiles
Permettant de créer
© A
Front-End
Single page

H & H: Research and Training 3 / 70


Introduction

Angular respecte l’architecture MVVM


MVVM : Model-View-ViewModel
Model : représenté généralement par une classe référencée par
la couche d’accès aux données (classe ou interface TypeScript).
View H I ©
U EL
O
contenant la disposition et l’apparence de ce qu’un utilisateur voit à
l’écran,
f E LM
r e
recevant l’interaction avec l’utilisateur : clic, saisie, survol...
ch
ViewModel ©A
remplaçant du contrôleur dans l’architecture MVC,
connecté à la vue par le data binding,
représenté dans Angular par un fichier *.component.ts.

H & H: Research and Training 4 / 70


Introduction

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

H & H: Research and Training 5 / 70


Introduction

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
©

H & H: Research and Training 6 / 70


Introduction

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.

H & H: Research and Training 7 / 70


Introduction

Angular

Change detection ?

réalisé par la librairie zone.js (qu’on peut trouver dans


node modules).
H I ©
EL
OU
utilisé pour synchroniser la vue avec le composant.
M
chaque composant dispose
f E L
d’un change detector qui surveille en
ch r e
particulier les expressions utilisées dans l’interpolation ou le
© A
propriété binding.
un changement de la valeur retournée par l’expression ⇒ mise à
jour de la vue.

H & H: Research and Training 8 / 70


Introduction

Quelques outils utilisés par Angular

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.

webpack : bundler JavaScript


U EL
O
LM
construit le graphe de dépendances.

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...

Ivy : moteur de compilation et de rendu utilisé partiellement dans Angular 8,


intégralement depuis la version 9. Il permet d’accélérer la compilation et d’avoir une
meilleure lisibilité des messages d’erreur.

H & H: Research and Training 9 / 70


Introduction

Angular

Quels langages utilise Angular ?


H I ©
HTML pour les vues. U EL
O
CSS pour les styles.
f E LM
r e
chles scripts depuis la version 2.
TypeScript pour
© A

H & H: Research and Training 10 / 70


Introduction

Les différentes versions d’Angular

Angular 1 (ou AngularJS) présenté en 2009 : utilisant JavaScript

Angular 2 présenté en octobre 2014 : remplacement du JavaScript par TypeScript

Angular 4 présenté en décembre 2016

Angular 5 présenté en novembre 2017

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

Angular 10 présenté en juin 2020

Angular 11 présenté en novembre 2021

H & H: Research and Training 11 / 70


Introduction

Les différentes versions d’Angular

Angular 1 (ou AngularJS) présenté en 2009 : utilisant JavaScript

Angular 2 présenté en octobre 2014 : remplacement du JavaScript par TypeScript

Angular 4 présenté en décembre 2016

Angular 5 présenté en novembre 2017

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

Angular 10 présenté en juin 2020

Angular 11 présenté en novembre 2021

Quelques sites Web réalisés avec Angular

https://www.madewithangular.com/

H & H: Research and Training 11 / 70


Installation

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

H & H: Research and Training 12 / 70


Installation

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

H & H: Research and Training 12 / 70


Installation

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)

npm install -g @angular/cli@6.1.0

H & H: Research and Training 12 / 70


Installation

Angular

Pour vérifier la version d’Angular installée, exécuter la commande


ng version
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 13 / 70


Installation

Angular

Pour vérifier la version d’Angular installée, exécuter la commande


ng version
H I ©
UEL
O
f E LM
r e
Pour explorer la liste des commandes Angular, exécuter la
ch
©A
commande
ng

H & H: Research and Training 13 / 70


Installation

Angular
Quel IDE (Environnement de développement intégré) ?

Visual Studio Code (À ne pas confondre avec Visual Studio)

Eclipse

...
H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 14 / 70


Installation

Angular
Quel IDE (Environnement de développement intégré) ?

Visual Studio Code (À ne pas confondre avec Visual Studio)

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...).

Pouvant s’étendre selon le langage de programmation.

Recommandé par Microsoft (créateur de TypeScript) pour les projets Angular.

H & H: Research and Training 14 / 70


Installation

Angular

Quelques recommandations pour VSC


Pour activer la sauvegarde automatique : aller dans File >
AutoSave.
H I ©
UEL
Pour bien indenter son code : sélectionner tout CTRL a ensuite
O
ALT Shift f.
f E LM
ch r e
©A

H & H: Research and Training 15 / 70


Installation

Angular

Quelques recommandations pour VSC


Pour activer la sauvegarde automatique : aller dans File >
AutoSave.
H I ©
UEL
Pour bien indenter son code : sélectionner tout CTRL a ensuite
O
ALT Shift f.
f E LM
ch r e
© A
Extension VSC pour les templates Angular

Angular Language Service

H & H: Research and Training 15 / 70


Création et structure d’un projet

Angular

Pour créer un nouveau projet Angular


ng new angular11

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 16 / 70


Création et structure d’un projet

Angular

Pour créer un nouveau projet Angular


ng new angular11

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)

H & H: Research and Training 16 / 70


Création et structure d’un projet

Angular

Pour lancer le projet, exécuter la commande (depuis la racine du projet)


ng serve

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 17 / 70


Création et structure d’un projet

Angular

Pour lancer le projet, exécuter la commande (depuis la racine du projet)


ng serve

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

H & H: Research and Training 17 / 70


Création et structure d’un projet

Angular

Pour lancer le projet, exécuter la commande (depuis la racine du projet)


ng serve

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

H & H: Research and Training 17 / 70


Création et structure d’un projet

Angular
Arborescence d’un projet Angular

e2e : contenant les fichiers permettant de tester l’application

node modules : contenant les fichiers nécessaires de la librairie nodeJS pour


un projet Angular
H I ©
src : contenant les fichiers sources de l’application L
U E
package.json : contenant l’ensembleM O
f E L de dépendance de l’application

.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...)

tslint.json : contenant les données sur les règles à respecter par le


développeur (nombre de caractères max par ligne, l’emplacement des
espaces...)

tsconfig.json : contenant les données de configuration de TypeScript

H & H: Research and Training 18 / 70


Création et structure d’un projet

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

H & H: Research and Training 19 / 70


Création et structure d’un projet

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

H & H: Research and Training 19 / 70


Création et structure d’un projet

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>

<!-- le composant web introduit dans le module principal -->


<app-root></app-root>
</body>
</html>
H & H: Research and Training 20 / 70
Création et structure d’un projet

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

H & H: Research and Training 21 / 70


Création et structure d’un projet

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

H & H: Research and Training 21 / 70


Création et structure d’un projet

Angular

Angular : les composants

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 22 / 70


Création et structure d’un projet

Angular

Angular : les modules

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 23 / 70


Création et structure d’un projet

Le fichier app.component.ts Le fichier app.component.html

@Component({ <div style="text-align:center">


selector: ’app-root’, <h1>
templateUrl: ’./app.component.html’, Welcome to {{ title }}!
styleUrls: [’./app.component.css’] </h1>
}) ...
export class AppComponent { </div>
title = ’angular11’;
}
H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 24 / 70


Création et structure d’un projet

Le fichier app.component.ts Le fichier app.component.html

@Component({ <div style="text-align:center">


selector: ’app-root’, <h1>
templateUrl: ’./app.component.html’, Welcome to {{ title }}!
styleUrls: [’./app.component.css’] </h1>
}) ...
export class AppComponent { </div>
title = ’angular11’;
}
H I ©
U EL
Explication
O
f E LM
@Component : pour déclarer cette classe comme 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

H & H: Research and Training 24 / 70


Création et structure d’un projet

Le fichier app.component.ts Le fichier app.component.html

@Component({ <div style="text-align:center">


selector: ’app-root’, <h1>
templateUrl: ’./app.component.html’, Welcome to {{ title }}!
styleUrls: [’./app.component.css’] </h1>
}) ...
export class AppComponent { </div>
title = ’angular11’;
}
H I ©
U EL
Explication
O
f E LM
@Component : pour déclarer cette classe comme 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 }}

Welcome to {{ title }} ! : title sera remplacé par sa valeur dans app.component.ts

H & H: Research and Training 24 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode 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

H & H: Research and Training 25 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Angular
On peut aussi utiliser la commande
ng generate class classes/personne

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 26 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

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

H & H: Research and Training 26 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

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

L’option --skipTests=true peut être utilisée avec la commande


generate quel que soit l’élément généré.

H & H: Research and Training 26 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Contenu de personne.ts

export class Stagiaire {


constructor(private _num?: number, private _nom?: string, private
_prenom?: string) { }

get num(): number | undefined {


return this._num;
}
set num(_num: number | undefined) {
H I ©
EL
this._num = _num;
}
O U
LM
get nom(): string | undefined {
return this._nom;
}
r e f E
ch
set nom(_nom: string | undefined) {

©A
this._nom = _nom;
}
get prenom(): string | undefined {
return this._prenom;
}
set prenom(_prenom: string | undefined) {
this._prenom = _prenom;
}
}

H & H: Research and Training 27 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

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

Afficher l’objet personne dans app.component.html


H I ©
<ul>
U EL
O
LM
<li> Nom : {{ personne.nom }} </li>

f
<li> Prénom : {{ personne.prenom }} </li>
r e E
</ul>
ch
©A

H & H: Research and Training 29 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Angular
L’écriture suivante
{{ personne }}

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 30 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Angular
L’écriture suivante
{{ personne }}

affiche
H I ©
[object Object]
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 30 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

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

H & H: Research and Training 30 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

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" }

H & H: Research and Training 30 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Angular

Créer un tableau d’entiers tab dans app.component.ts


@Component({
selector: ’app-root’,
templateUrl: ’./app.component.html’,
H I ©
EL
styleUrls: [’./app.component.css’]
})
O U
export class AppComponent {
f E LM
title = ’cours-angular’;
ch r e
personne: Personne = new Personne(100, ’Wick’, ’
John’); ©A
tab: number[] = [2, 3, 5, 8];
constructor() {
}
}

H & H: Research and Training 31 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Afficher le tableau tab dans app.component.html


<ul>
<li> {{ tab[0] }} </li>
<li> {{ tab[1] }} </li>
<li> {{ tab[2] }} </li>
<li> {{ tab[3] }} </li>
H I ©
EL
</ul>

O U
f E LM
ch r e
©A

H & H: Research and Training 32 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Afficher le tableau tab dans app.component.html


<ul>
<li> {{ tab[0] }} </li>
<li> {{ tab[1] }} </li>
<li> {{ tab[2] }} </li>
<li> {{ tab[3] }} </li>
H I ©
EL
</ul>

O U
LM
Remarques

Ce code est trop répétitif


r e f E
ch
©A
Et si on ne connaissait pas le nombre d’éléments
Ou si on ne voulait pas afficher tous les éléments

H & H: Research and Training 32 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

Afficher le tableau tab dans app.component.html


<ul>
<li> {{ tab[0] }} </li>
<li> {{ tab[1] }} </li>
<li> {{ tab[2] }} </li>
<li> {{ tab[3] }} </li>
H I ©
EL
</ul>

O U
LM
Remarques

Ce code est trop répétitif


r e f E
ch
©A
Et si on ne connaissait pas le nombre d’éléments
Ou si on ne voulait pas afficher tous les éléments

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

import { Component } from ’@angular/core’;


import { Personne } from ’./classes/personne’;
@Component({
selector: ’app-root’,
templateUrl: ’./app.component.html’,
H I ©
styleUrls: [’./app.component.css’]
U EL
})
O
export class AppComponent {
f E LM
title = ’cours-angular’;

ch r e
personne: Personne = new Personne(’Wick’, ’John’);

©A
tab: number[] = [2, 3, 5, 8];
constructor() {
}
direBonjour(): string {
return ’bonjour Angular’;
}
}

H & H: Research and Training 33 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode Interpolation

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

H & H: Research and Training 34 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode One way binding

Angular

Pour afficher le contenu de l’attribut title dans le template, on peut utiliser


l’interpolation

<p> {{ title }} </p>

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 35 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode One way binding

Angular

Pour afficher le contenu de l’attribut title dans le template, on peut utiliser


l’interpolation

<p> {{ title }} </p>

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
©

H & H: Research and Training 35 / 70


Affichage d’attribut (de type objet ou tableau) ou méthode One way binding

Angular

Pour afficher le contenu de l’attribut title dans le template, on peut utiliser


l’interpolation

<p> {{ title }} </p>

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

H & H: Research and Training 35 / 70


Directives Angular

Angular
Plusieurs directives possibles

*ngFor

*ngIf

H I ©
*ngSwitch
UEL
O
ngStyle
f E LM
ngClass
ch r e
©A

H & H: Research and Training 36 / 70


Directives Angular

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

H & H: Research and Training 36 / 70


Directives Angular *ngFor

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

H & H: Research and Training 37 / 70


Directives Angular *ngFor

Angular

Afficher le tableau tab en utilisant *ngFor


H I ©
<ul>
UEL
<li *ngFor="let elt of tab">
O
{{ elt }}
f E LM
</li>
ch r e
©A
</ul>

H & H: Research and Training 38 / 70


Directives Angular *ngFor

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

H & H: Research and Training 39 / 70


Directives Angular *ngFor

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>

H & H: Research and Training 39 / 70


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 }}
H I ©
</li>
UEL
</ul>
O
f E LM
ch r e
©A

H & H: Research and Training 40 / 70


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 }}
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.

H & H: Research and Training 40 / 70


Directives Angular *ngFor

Angular

Considérons la liste suivante (à déclarer dans app.component.ts)


personnes: Array<Personne> = [
new Personne(100, ’Wick’, ’John’),
new Personne(101, ’Abruzzi’, ’John’),
H I ©
EL
new Personne(102, ’Marley’, ’Bob’),
new Personne(103, ’Segal’, ’Steven’)
O U
LM
];

r e f E
ch
©A

H & H: Research and Training 41 / 70


Directives Angular *ngFor

Angular

Considérons la liste suivante (à déclarer dans app.component.ts)


personnes: Array<Personne> = [
new Personne(100, ’Wick’, ’John’),
new Personne(101, ’Abruzzi’, ’John’),
H I ©
EL
new Personne(102, ’Marley’, ’Bob’),
new Personne(103, ’Segal’, ’Steven’)
O U
LM
];

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 .

H & H: Research and Training 41 / 70


Directives Angular *ngIf

Angular

Pour tester puis afficher si le premier élément est impair


H I ©
<ul>
UEL
<li *ngIf="tab[0] % 2 != 0">
O
{{ tab[0] }} est impair
f E LM
</li>
ch r e
©A
</ul>

H & H: Research and Training 42 / 70


Directives Angular *ngIf

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

H & H: Research and Training 43 / 70


Directives Angular *ngIf

Angular

Une première solution avec *ngIf et else


<ul>
<li *ngIf="tab[0] % 2 != 0; else sinon">
H I ©
EL
{{ tab[0] }} est impair
</li>
O U
<ng-template #sinon>
<li>
f E LM
{{ tab[0] }} est pair
ch r e
</li>
</ng-template>
©A
</ul>

ng-template n’apparaı̂tra pas dans le DOM de la page.

H & H: Research and Training 44 / 70


Directives Angular *ngIf

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>

H & H: Research and Training 45 / 70


Directives Angular *ngIf

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

H & H: Research and Training 46 / 70


Directives Angular *ngIf

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>

ng-container n’apparaı̂tra pas dans le DOM de la page.

H & H: Research and Training 47 / 70


Directives Angular *ngIf

Angular

Exercice

Écrire un code HTML, en utilisant les directives Angular, qui permet


d’afficher sous forme d’une liste chaque élément du tableau H I ©
EL
OU
moyennes = [18, 5, 11, 15] avec un message défini ainsi :
M
E
Si la valeur est comprise entre
f L 0 et 9 : échec
h
Si elle est entrec10 rete13 : moyen
A
©entre
Si elle est 14 et 16 : bien
Sinon : très bien

H & H: Research and Training 48 / 70


Directives Angular ngSwitch

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

Refaire cet exercice avec ngSwitch

Écrire un code HTML, en utilisant les directives Angular, qui permet


H I ©
EL
d’afficher sous forme d’une liste chaque élément du tableau
moyennes avec un message défini ainsi :
M OU
E
Si la valeur est comprise entre
f L 0 et 9 : échec
h
Si elle est entrec10 rete13 : moyen
©A
Si elle est entre 14 et 16 : bien
Sinon : très bien

H & H: Research and Training 50 / 70


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>
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>

H & H: Research and Training 51 / 70


Directives Angular ngSwitch

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

H & H: Research and Training 52 / 70


Directives Angular ngStyle

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

H & H: Research and Training 53 / 70


Directives Angular ngStyle

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
}

H & H: Research and Training 54 / 70


Directives Angular ngStyle

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>

H & H: Research and Training 54 / 70


Directives Angular ngStyle

Angular

Pour utiliser une couleur définie dans un attribut de la classe


H I ©
associée
UEL
O
f E LM
<p [textContent]=nom [ngStyle]="{backgroundColor:
couleur}"></p>
ch r e
©A

H & H: Research and Training 55 / 70


Directives Angular ngStyle

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’;
}
}

H & H: Research and Training 56 / 70


Directives Angular ngStyle

Angular

Pour afficher le contenu de l’attribut nom dans le template avec


une couleur de fond rouge
H I ©
UEL
<p [ngStyle]="{color: getColor(), backgroundColor:
O
getBackgroundColor()}">
f E LM
{{ nom }}
ch r e
©A
</p>

H & H: Research and Training 57 / 70


Directives Angular ngClass

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

c h dans ou dans la feuille de style.

©A

H & H: Research and Training 58 / 70


Directives Angular ngClass

Angular
Considérons le contenu suivant de app.component.ts

import { Component } from ’@angular/core’;

@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

H & H: Research and Training 59 / 70


Directives Angular ngClass

Angular
Considérons le contenu suivant de app.component.ts

import { Component } from ’@angular/core’;

@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;
}

H & H: Research and Training 59 / 70


Directives Angular ngClass

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

H & H: Research and Training 60 / 70


Directives Angular ngClass

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
©

H & H: Research and Training 60 / 70


Directives Angular ngClass

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;
}

H & H: Research and Training 60 / 70


Directives Angular ngClass

Angular

Ainsi, on peut faire aussi un affichage conditionnel


<p [ngClass]="{’rouge’: nom == ’wick’}">
{{ nom }}
</p>
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 61 / 70


Directives Angular ngClass

Angular

Ainsi, on peut faire aussi un affichage conditionnel


<p [ngClass]="{’rouge’: nom == ’wick’}">
{{ nom }}
</p>
H I ©
EL
M OU
E
Ou encore (le paragraphefseraLaffiché en rouge si nom contient
wick, en bleu sinon)hr
c e
©A
<p [ngClass]="{’rouge’: nom == ’wick’, ’bleu’: nom
!= ’wick’}">
{{ nom }}
</p>

H & H: Research and Training 61 / 70


Directives Angular ngClass

Angular

On peut aussi utiliser les expressions ternaires


H I ©
UEL
<p [ngClass]="nom == ’wick’ ? ’rouge’ : ’bleu’">
O
{{ nom }}
f E LM
</p>
ch r e
©A

H & H: Research and Training 62 / 70


Directives Angular ngClass

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

H & H: Research and Training 63 / 70


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 }}
H I ©
EL
</li>
</ng-container>
O U
LM
</ul>

r e f E
ch
©A

H & H: Research and Training 64 / 70


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 }}
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>

H & H: Research and Training 64 / 70


Directives Angular ngClass

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

H & H: Research and Training 65 / 70


Directives Angular ngClass

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;
}

H & H: Research and Training 65 / 70


Directives Angular ngClass

Angular

Considérons la liste personnes précédente


personnes: Array<Personne> = [
new Personne(100, ’Wick’, ’John’),
new Personne(101, ’Abruzzi’, ’John’),
new Personne(102, ’Marley’, ’Bob’),
H I ©
new Personne(103, ’Segal’, ’Steven’)
UEL
]; O
f E LM
ch r e
©A

H & H: Research and Training 66 / 70


Directives Angular ngClass

Angular

Considérons la liste personnes précédente


personnes: Array<Personne> = [
new Personne(100, ’Wick’, ’John’),
new Personne(101, ’Abruzzi’, ’John’),
new Personne(102, ’Marley’, ’Bob’),
H I ©
new Personne(103, ’Segal’, ’Steven’)
UEL
]; O
f E LM
ch r e
Exercice ©A
Écrire un script Angular qui permet d’afficher dans une liste HTML les
éléments de la liste personnes (on affiche que les nom et prénom). Les
éléments d’indice pair seront affichés en rouge, les impairs en bleu.

H & H: Research and Training 66 / 70


Directives Angular ngClass

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

H & H: Research and Training 67 / 70


Directives Angular ngClass

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>

H & H: Research and Training 67 / 70


Directives Angular ngClass

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

H & H: Research and Training 68 / 70


Directives Angular ngClass

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;
}

H & H: Research and Training 68 / 70


Commandes utiles

Angular

Pour désinstaller Angular


npm uninstall -g @angular/cli

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 69 / 70


Commandes utiles

Angular

Pour désinstaller Angular


npm uninstall -g @angular/cli

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

H & H: Research and Training 69 / 70


Commandes utiles

Angular

Pour mettre à jour la version d’Angular

H I ©
EL
ng update @angular/cli @angular/core

O U
f E LM
ch r e
©A

H & H: Research and Training 70 / 70


Commandes utiles

Angular

Pour mettre à jour la version d’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

H & H: Research and Training 70 / 70

Vous aimerez peut-être aussi