1. Développement Framework coté client
Enseignant : Nizar MAATOUG
Institut Supérieur des Études Technologiques de Sidi Bouzid
2019/2020
2. Nizar MAATOUG2
Résultats
À la fin de ce module, vous serez en mesure de :
Maîtriser l’architecture et les concepts du Framework Angular
Développer des applications Angular
3. Nizar MAATOUG3
Structure
Notion de Framework
Introduction au Framework Angular
les langages de programmation utilisés par Angular
Architecture du framework Angular
Démarrer avec Angular
Structure d’un projet Angular
Les composants
Liaison de données (Data Binding)
Les directives
Interaction entre composants
Routage et navigation
Les services
HTTP et les Observables
Formulaires Angular (Template Driven Forms & Formulaire Réactif)
5. Nizar MAATOUG5
Notion de Framework
Un Framework désigne un ensemble cohérent de composants logiciels
structurels
Un Framework sert à créer les fondations ainsi que les grandes lignes de
tout ou d’une partie d'un logiciel (architecture).
composant 1 composant 2 composant n
Framework
7. Nizar MAATOUG7
Introduction au framework Angular
Angular Permet de créer la partie Front-End des applications web de
type SPA (Single Page Application)
Une SPA est une application qui contient une seule page HTML
La seule page contient différents composants web.
9. Nizar MAATOUG9
TypeScript
langage de programmation orienté objet
open source
influencé par C# et JavaScript
Développé et présenté par MicroSoft en 2012
il permet de :
typer les variables
définir des classes et des interfaces
utiliser les annotations (les décorateurs)
exporter et importer des modules
10. Nizar MAATOUG10
Evolution
Angular 1 (ou AngularJS) présenté en 2009 :
Première version de Angular.
Elle est basée sur une architecture MVC coté client.
Les applications Angular 1 sont écrite en JavaScript.
Angular 2 présenté en octobre 2014 :
Réécriture de Angular 1
Les applications de Angular2 sont écrites en Type Script qui est compilé et traduit
en Java Script avant d’être exécuté par les Browsers Web.
Angular 2 est basée sur une programmation basée sur les Composants Web (Web
Componenet)
remplacement du JavaScript par TypeScript
Angular 4, 5, 6, 7, 8 sont de simples mises à jour de Angular 2
15. Nizar MAATOUG15
Architecture du framework Angular
Une application Angular se compose de :
Un à plusieurs modules dont un est principal.
Chaque module peut inclure :
Des composant web : La partie visible de l‘application Web (IHM)
Des services pour la logique applicative.
19. Nizar MAATOUG19
Installation des outils
1. NodeJS : https://nodejs.org/en/download/
NodeJS installe l’outil npm (Node Package Manager) qui permet de télécharger
et installer des bibliothèques JavaScript.
2. Installer ensuite Angular CLI (Command Line Interface) qui vous
permet de générer, compiler, tester et déployer des projets angular
(https://cli.angular.io/ ) :
npm install -g @angular/cli
20. Nizar MAATOUG20
Nouveau projet Angular
Pour générer la structure d’un projet Angular, on utilise Angular CLI via sa
commande ng suivie des options new et le nom du projet.
ng new FirstApp
Cette commande génère les différents fichiers requis par une application
basique Angular et installe aussi toutes les dépendances requise par ce
projet.
21. Nizar MAATOUG21
Exécuter un projet Angular
Pour excuter un projet Angular, on exécute la
commande suivante à partir de la racine du
projet
ng serve
Cette commande compile le code source du
projet pour transpiler le code TypeScript en
JavaScript et en même temps démarre un
serveur Web local basé sur NodeJS pour
déployer l’application localement.
Pour tester le projet généré, il suffit de lancer
le Browser et taper l’url :
http:// localhost:4200
22. Nizar MAATOUG22
Edition du projet
Plusieurs IDE professionnels peuvent être utilisés pour éditer le code:
Web Storm
Visual Studio Code
Eclipse avec plugin Angular
D’autres éditeurs classiques peuvent être aussi utilisé :
Atom
Sublime Text
…
24. Structure d’un projet Angular
Nizar MAATOUG24
Fichiers de test end to end de l’application
Dépendances externes du projet (Librairies javaScripts et css)
Logique applicative du projet (Modules, composants,
services,…)
Code source du projet
Fichiers de configuration du projet
28. Les composants
Chaque composant se compose de:
Un classe représentant sa logique métier
Une template HTML: représentant sa vue
Une feuille de style css
Un fichier de test unitaire
Nizar MAATOUG28
29. Création de nouveaux composants
• Pour créer facilement des composants Angular, on peut utiliser la
commande ng comme suit :
ng generate component NomComposant
• Dans notre exemple, nous allons créer deux composants : about et
contacts
29 Nizar MAATOUG
30. Les composants: Détails
Nizar MAATOUG30
Décorateur: indique à Angular
que cette classe joue le rôle
d’un composant avec:
•Un sélecteur ‘app-about’
•Un template HTML
‘./about.component.html’
•Un seul fichier de style css
‘./about.component.css’
32. Utilisation d’un composant
Un composant peut être inséré dans n’importe quel partie HTML de
l’application en utilisant son sélecteur
Dans cet exemple, les deux composants about et contacts sont
insérés à l’intérieur du composant racine AppComponent
Nizar MAATOUG32
AppComponent
about contacts
34. Data Binding
• Permet de faire un lien entre les données de la classe du composant
et son Template associé
Nizar MAATOUG34
Classe du composant Template du composant
data string interpolation {{data}}
property Binding <…[property]="data" …
doSome(){
…..
}
<… (click)="doSome()"Event Binding
<input [(ngModel)]="data"Two Ways Data Binding
39. Les directives
Il existe deux types de directives:
Les directives structurelles: Elles ont pour but de modifier le DOM en
ajoutant, enlevant ou replaçant un élément du DOM.
Les attribute directives: Elles ont pour but de modifier l'apparence ou le
comportement d'un élément.
Nizar MAATOUG39
41. Directive ngIf
Permet de supprimer ou de recréer l'élément courant suivant
l'expression passée en paramètre
Exemple:
<div *ngIf="1 > 0"> Afficher la div</div>
<div *ngIf="1 < 0"> N’affiche pas la div</div>
Nizar MAATOUG41
47. 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
Nizar MAATOUG47
public styleCorrect={'background-color':'green'};
<div [ngStyle]="styleCorrect">Réponse<div>
48. ngClass
permet d’attribuer de nouvelles classes d’un élément HTML
s’utilise conjointement avec le property binding pour récupérer
des valeurs définies dans la classe ou dans la feuille de style
Nizar MAATOUG48
<div [ngClass]="{'text-success':question.isCorrect}">Réponse</div>
49. Questions
1) Quelle est la commande CLI qui permet de créer un nouveau
component ?
ng new nom-composant
ng generate nom-composant
Ng build nom-composant
La commande ng generate permet de créer de nouveaux éléments
(components, services etc.) dans un projet existant. ng new crée un
nouveau projet ; ng build crée le package global d'un projet terminé.
Nizar MAATOUG49
50. Questions
2) Si vous avez une variable name = ‘Nizar' dans votre code
TypeScript, quelle syntaxe utilisez-vous pour
afficher Nizar dans le template ?
les doubles accolades {{ }}
les crochets [ ]
les parenthèses ( )
Les doubles accolades {{}} correspondent au string interpolation,
permettant d'afficher le résultat d'une expression TypeScript dans le
template — ici, une variable.
Nizar MAATOUG50
51. Questions
3) Vous souhaitez qu'un bouton de votre template déclenche une
fonction dans votre TypeScript : quelle syntaxe utilisez-vous
pour l'y lier ?
(onClick)
(click)
[click]
En effet, pour lier à l'événement click d'un élément, on utilise la
syntaxe (click) .
Nizar MAATOUG51
52. Questions
4) Pour qu'un bouton soit désactivé quand la
valeur authenticated est false , quelle syntaxe devez-vous
utiliser ?
<button disabled="!authenticated">
<button (disabled)="!authenticated">
<button [disabled]="!authenticated">
Il faut utiliser les crochets [ ] pour lier l'expression
conditionnelle à la propriété disabled du bouton.
Nizar MAATOUG52
53. Questions
5) Dans quels cas ce paragraphe apparaîtra dans le DOM ?
<p *ngIf="myCondition">Bonjour !</p>
(Plusieurs réponses sont possibles)
myCondition = false;
myCondition = true;
myCondition: string;
myCondition: boolean;
myCondition = "aucune condition";
Un élément qui comporte la directive *ngIf s'affiche si la condition
donnée est une expression conditionnelle qui retourne true .
Nizar MAATOUG53
54. Questions
6) Quelle directive vous permet d'afficher autant de
components <app-draw> qu'il y a de membres dans
l'array drawings ?
<app-draw *ngIf="drawings">
<app-draw *ngFor="let drawing of drawings">
<app-draw *ngFor="for drawing in drawings">
<app-draw *ngFor="drawings">
La directive *ngFor s'emploie comme un for loop classique :
on utilisera donc let … of … .
Nizar MAATOUG54
65. Routage et Navigation
Une application Angular contient plusieurs composants,
Chaque composant possède une vue (template)
Il faut pouvoir naviguer entre les vues quand l’utilisateur réalise une
action.
Nizar MAATOUG65
66. Cas d’utilisation: Routage et Navigation
Nizar MAATOUG66
Localhost:4200
Routing navigation
Départements Employés
localhost:4200/departements
localhost:4200/employes
67. Démarche
1) Générer un projet Angular avec l’option routing
2) Générer les composants departementList et emplyesList
3) Configurer les routes
4) Ajouter les boutons et utiliser les directives pour naviguer.
Nizar MAATOUG67
79. Route de Redirection
Très souvent, un utilisateur essaye de naviguer vers une route qui
n’est pas configurée.
Cela génère une exception.
Nizar MAATOUG79
Solution: rediriger les routes inexistantes
vers un composants « not found »
83. Routes avec paramètres
Nizar MAATOUG83
1) Technologies de L’informatique
2) Électrique
3) Mécanique
4) Gestion
DepartementList
Vous avez sélectionné le
département avec l’id= 1
DepartementDetails
id
84. Démarche
Générer un composant DepartementDetails
Configurer le routage avec paramètres vers DepartementDetails
Dans le composant DepartementList, programmer la navigation vers DepartementDetails
Dans le composant DepartementDetails, extraire l’id de la route active.
Nizar MAATOUG84
93. Inconvénients
Les données sont codés en dur.
Les données sont dupliquées dans les deux composants
Forte possibilité d’incohérence de données
Ajout de responsabilité aux composants (gestion des données)
Nizar MAATOUG93
94. Solution
Déporter les données dans un service.
Les services sont conçus pour offrir des données et/ou des fonctionnalités
partagées entre plusieurs composants ou modules:
Partage de données
Partage de fonctions (exemple calcul d’age)
Connexion réseau et mise à jour des données persistantes avec un
service.
Nizar MAATOUG94
102. HTTP
Une application Angular est SPA (Single Page Application)
Une application Angular s’exécute coté client
Elle doit pouvoir se connecter à un serveur pour synchroniser les
données métier (demander liste de voitures, ajouter nouveau client,
modification, suppression d’une entité métier,….).
Nizar MAATOUG102
104. Les Observables: programmation Réactive
La programmation réactive se base sur le concept d'observateur.
Nizar MAATOUG104
Observable
Source de données,
flux de données
EmployeList EmployeDetails Composant…
notification
notification
105. Programmation réactive
Avantages:
• Asynchrone
• non bloquante
• Interface graphique plus fluide
Application:
• Data binding
• Gestion des événements
RxJS (Reactive Extentions for JavaScript) est la bibliothèque JavaScript
pour la programmation réactive
Nizar MAATOUG105
106. HTTP, Observables et RxJS: Démarche
1. Définir une requête HTTP GET de EmployeService
2. Recevoir un observable, convertir le flux de données en un tableau
d’employés (casting)
3. Abonner les deux composants EmployeList et EmployeDetails à cet
observable
Nizar MAATOUG106
111. Mettre à jour EmployeService
Nizar MAATOUG111
Type de retour:
Observable d’Employé
Appel GET au service web en spécifiant
l’url. le type de retour est spécialisé à
Employee
113. Abonner les composants EmployeList et EmloyeDetails à l’observable
Nizar MAATOUG113
Retourne un
observable d’employés
Abonnement au flux de
l’observable
Traitement du flux par
une fonction lambda
116. Angular Forms
Un moyen d’interaction avec l’utilisateur
Manipuler les données de l’application:
Ajout, modification de données métiers
En Angular, il y a deux grandes méthodes pour créer des formulaires :
• la méthode template : vous créez votre formulaire dans le template, et
Angular l'analyse pour comprendre les différents inputs et pour en
mettre à disposition le contenu
• la méthode réactive : vous créez votre formulaire en TypeScript et
dans le template, puis vous en faites la liaison manuellement — cette
approche est plus complexe, mais elle permet beaucoup plus de
contrôle et une approche dynamique.
Nizar MAATOUG116
124. Directive ngForm
Angular associe à chaque formulaire une directive ngForm pour suivre
son état:
• Valeurs des contrôles du formulaire
• Les valeurs sont valides ou non.
Nizar MAATOUG124
129. Directive ngModelGroup
Permet de regrouper un ensemble de contrôle dans un seul objet
Exemple: une adresse est composée d’une ville, rue et numéro maison
Nizar MAATOUG129
135. Suivi de l’état et de la validité du formulaire
L'utilisation ngModel dans un formulaire offre plus qu'une simple liaison de
données bidirectionnelle
elle indique également si l'utilisateur a touché le contrôle, si la valeur a changé ou
si la valeur est devenue invalide
elle met à jour aussi le contrôle avec des classes CSS Angular spéciales qui
reflètent son état.
Nizar MAATOUG135
136. Suivi de l’état et de la validité du formulaire
Nizar MAATOUG136
137. Suivi de l’état et de la validité du formulaire
Nizar MAATOUG137
138. Appliquer les classes CSS
Deux solutions sont possibles:
1- Définir les classes .ng-valid,…:
2- Utiliser vos propres classes:
Nizar MAATOUG138
139. Appliquer les classes CSS
Nizar MAATOUG139
Obtenir la référence de ngModel
Appliquer la classe is-invalid de
Bootstrap si le contrôle est invalide
et il est déjà touché
140. Afficher un message d’erreur
Nizar MAATOUG140
Le message sera affiché si le
contrôle est invalide et il est déjà
touché
145. Reactive Forms
• La grande partie du code réside dans la classe du composant
• Adapté aux scénarios complexes
• Des contrôles de formulaires dynamique
• Validation dynamique
• Test unitaire
Nizar MAATOUG145
149. FormGroup et FormControl
Nizar MAATOUG149
Nom
Email
FormControl
FormControl
FormGroup
Un formulaire réactif est de type FormGroup et il regroupe plusieurs FormControl
157. FormControl dynamique
Objectif: ajouter dynamiquement des contrôles hobby
FormArray: permet de définir un tableau de FormControl
Nizar MAATOUG157
Définir un tableau de
hobbies, initialement vide