Cours Angular
Cours Angular
Introduction
01
Démarrer avec Angular-Cli
02
Services/Components
03
04 Le routage avec Angular
Introduction
Angular est un framework Javascript côté client qui permet de réaliser des
applications de type "Single PageApplication".
Il est basé sur le concept de l'architecture MVC (Model View Controller)
qui permet de séparer les données, les vues et les différentes actions
que l'on peut effectuer . il utilise le TypeScript .
Angular a été crée par Misko Hevery et Adam Abronsw en 2009.
Single Page Application (SPA)
Type Script est un langage de script structuré et orienté objet qui permet de
simplifier le développement d’applications JavaScript.
9
L'outil Angular CLI
ANGULAR/ CLI “Command Line Interface” d’Angular est l’outil qui vous permet
d’exécuter des scripts pour la création, la structuration et la production d’une
application Angular.
Nous allons installer la dernière version qui est à ce jour la « 14 » en lançant votre console préférée et en
tapant ceci : npm install -g @angular/cli
[Link]
Créez votre premier projet
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 mon-premier-projet.
L'Angular CLI comprend un serveur, pour que vous puissiez créer et servir votre
application localement.
Accédez au dossier de l'espace de travail, tel que mon-premier-projet.
Exécutez la commande suivante :
cd mon-premier-projet.
ng serve --open.
Créez votre premier projet
L' option –open (ou simplement -o) ouvre automatiquement votre navigateur sur
[Link]
Si votre installation et configuration ont réussi, vous devriez voir une page semblable
à la suivante.
Créez votre premier projet
14
Découvrez la structure du code
Le dossier src où vous trouverez tous les fichiers sources pour votre
application.
src/assets : cet espace permet d'y placer tous les assets tels que les
images
Découvrez la structure du code
19
Les propriétés templateUrl et styleUrls
templateURL
permet de définir dans à l’intérieur du décorateur le code HTML
représentant la vue du composant
permet d’associer un fichier externe HTML contenant la structure de la vue
du composant
Exemple:
pour modifier notre component en supprimant le
fichier [Link] et en modifiant le code comme ceci : template:
'<h1> Mon premier Component </h1> <p> en action </p>',
Les propriétés templateUrl et styleUrls
21
Les propriétés templateUrl et styleUrls
styleUrls
spécifier les feuilles de styles CSS associées à ce composant
Exemple:
nous pouvons supprimer le fichier [Link] et remplacer
stylesUrl par la propriété styles. Le fichier [Link] ne contenait
pas de styles, mais nous allons en profiter pour corriger cela avec un peu de
rouge :
styles: [
`
h1{
color:red
}`
]
Les propriétés templateUrl et styleUrls
Un composant est une directive avec un modèle qui permet de construire des blocs
d’une interface utilisateur dans une application angular
Le component est issu de la mouvance « Web components » comme vous pouvez vous en
douter. Les Components reposent sur un certain nombre de règles :
Un component ne gère que sa vue et ses données. Il n’a pas à modifier les données ou le
DOM qui est en dehors de son scope.
Les components communiquent entre eux via les évènements, il n'y a pas d'interactions
directes.
24
Créez votre premier component
25
Créez votre premier component
Dans notre exemple, nous allons créer deux composants : about et contacts
Créez votre premier component
[Link]
Structure du composant import { Component, OnInit } from '@angular/core';
@Component({
about: selector: 'app-about',
templateUrl: './[Link]', styleUrls:
['./[Link]']
})
[Link]
Créez votre premier component
@Component
<div style="text-align:center">
<h1>
Welcome to {{title}}!!
</h1>
<app-about></app-about>
<div app-contacts></div>
</div>
Le service
Les services sont des objets qui ne sont instanciés qu'une seule fois pendant la durée de vie
d'une application. L'objectif principal d'un service est de partager des données, des fonctions
avec différents composants d'une application Angular.
ng g s nomService
31
Imbrication de Components
AppModule
AppModule
AppComponent
AppComponent
AboutComponent ContactsComponent
About Contacts
Component Component
Le Routage avec Angular
Angular a donc besoin d'un système de routage pour permettre la navigation à
travers
différentes pages de votre application.
Pour réaliser ce routage, Angular propose le module RouterModule
disponible dans la librairie @angular/router.
36
Le Data Binding
Le Data Binding est un élément essentiel dans les frameworks de Single Page
Application. Il permet de synchroniser la vue au modèle JavaScript sous-jacent. Voici un
schéma général du fonctionnement du Data Binding :
37
Le Data Binding
38
Le Data Binding
39
Le Data Binding
40
L'interpolation
Nous allons enfin commencer à dynamiser nos applications grâce au Data Binding !
Commençons par créer un nouveau projet prj-data-binding à l'aide d'Angular-Cli :
41
L'interpolation
42
L'interpolation
Dans cet exemple, nous avons un template basique pour décrire l'identité d'une personne.
J'ai utilisé les {{ }} pour binder les propriétés du Component avec leur pendant dans le
template. Avec ce mécanisme, il est donc possible d'afficher une propriété de votre modèle
dans votre template en la nommant de la même façon. Comme nous avons le plaisir
d'utiliser TypeScript, j'en ai profité pour typer les propriétés du Component. Ainsi, person est
une string ; age est un number ; et address est un any. J'ai fait de l'interpolation !
43
L'interpolation
44
L'interpolation
Les interpolations {{person}} et {{age}} ont bien fonctionné. person étant une string, aucune
transformation n'est à opérer pour remplacer {{person}} par "John Doe". age était un number
et a été transformé en string à l'aide du mécanisme de cast, et il s'affiche donc plutôt bien.
Par contre, notre adresse, étant un objet, a été castée en [object Object]. Pour afficher un
object, notre template doit explicitement inscrire {{[Link]}}, par exemple, pour afficher
la rue.
L'interpolation est donc une fonctionnalité bien utile pour afficher une donnée et la
synchroniser en permanence avec le modèle.
45
[Le Property Binding]
Le property Binding est également un mécanisme de Data Binding "one way". Tout
comme l'interpolation, il permet de répercuter dans le DOM les valeurs des propriétés du
Component. L'annotation associée est […] mais pour les réfractaires, il est possible de
préfixer par bind- les propriétés.
Le Property Binding est utilisable :
Sur un élément du DOM. Par exemple <img [src] ="…" /> ou <img bind-src ="…" /> .
Sur un attribute directive. Par exemple <div [ngClass] ="…"> ou <div bind-
ngClass ="…"> .
Sur la propriété d'un component. Par exemple <page [color] ="…"> ou <page bind-
color ="…">
46
[Le Property Binding]
47
[Le Property Binding]
Utiliser l'interpolation, à savoir, modifier notre div comme ceci :
48
[Le Property Binding]
Utiliser le Property Binding, à savoir, modifier notre div comme cela :
49
[Le Property Binding]
50
[Le Property Binding]
Le Property Binding sur un attribute directive fonctionne de la même manière. Pour rappel,
un attribute directive est une directive modifiant le comportement ou l'apparence d'un
élément.
Angular propose déjà une série d'attribute directives tels que ngClass ou ngStyle.
Imaginons que l'on veuille changer la couleur du texte de notre div à l'aide des styles CSS.
Angular propose d'utiliser la directive ngStyle afin d'appliquer dynamiquement un attribut de
style CSS sur l'élément courant. Pour réaliser cette prouesse, la directive ngStyle utilise le
Property Binding.
51
[Le Property Binding]
Nous pouvons donc nous créer une propriété couleur dans notre component et appliquer
cette couleur en tant que style CSS :
Le Data Binding va remplacer la variable couleur dans le template par sa valeur 'red' définie
dans le Component.
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
52
[Le Property Binding]
<div [align]="alignement" [ngStyle]="{color:couleur}">Personne : {{person}} |
Age : {{age}} | Adresse : {{[Link]}}</div>
`
})
export class AppComponent {
53
[Le Property Binding]
age:number= 30;
alignement:string = 'right';
couleur:string = 'red';
}
[Le Property Binding]
55
[Le Property Binding]
56
[Le Property Binding]
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<div [align]="alignement" [ngStyle]="{color:couleur}">Personne : {{person}} | Age : {{age}} | Adresse :
{{[Link]}}</div>
<app-comp1 [monAdresse]="address"></app-comp1>
`
})
export class AppComponent {
}
[Le Property Binding]
Dans ce Property Binding, nous retrouvons bien la propriété address à droite de l'égalité et
entre [ ] (à gauche donc) un nom de propriété ( comme finalement ngStyle, ngClass, …) qui
sera valorisé par le mécanisme de Property Binding. Notre Component Comp1Component
récupérera donc address au niveau de sa portée. C'est ici que le decorator @Input entre en
jeu. En le positionnant devant une variable, le mécanisme de Data Binding dans le sens
"extérieur vers intérieur" se met en place.
[Le Property Binding]
[Le Property Binding]
Avec le Property Binding, vous avez pu, à partir d'un component, binder une propriété
pour interagir avec un élément du DOM. Maintenant, vous allez voir comment, à partir
d'un évènement du DOM, interagir avec un Component.
Pour réaliser ce Data Binding, Angular utilise les évènements ; D'où le nom de Event
Binding. Avec ce mécanisme, vous pouvez être averti des évènements utilisateurs tels
que le click, la frappe sur le clavier, le touch, ….
61
[Le Property Binding]
62
[Le Property Binding]
63
[Le Property Binding]
(L’event Binding)
Si vous cliquez sur le bouton, l'adresse sera automatiquement modifiée dans notre
template en haut à droite de l'écran.
Vous pouvez aussi créer vos propres Event Binding très simplement afin d'envoyer un
évènement d'un Component vers un Component parent.
Pour illustrer cela, nous allons utiliser notre Component Comp2Component créé
précédemment. Ce Component sera chargé d'incrémenter ou de décrémenter une variable
à l'aide de deux boutons et envoyer le résultat via un évènement.
Le Component parent AppComponent s'occupera, lui, de récupérer cet évènement afin
d'afficher la valeur.
(L’event Binding)
Si vous avez l'oeil, vous avez sans doute observé un nouveau decorator : @Output.
Ce décorateur se veut être le pendant du decorator @Input. Quand @Input se charge
de recevoir une valeur,@Output se charge, lui, d'envoyer une donnée. Ainsi,
counterChange est une instance de classe EventEmitter en charge d'envoyer un
évènement lors une pression sur un des boutons.
*EventEmitter est une classe utilisée dans une directive ou un component pour émettre
un évènement. Sa méthode principale est emit(value? : T) qui permet d'envoyer un
évènement contenant potentiellement un objet ou une valeur.
(L’event Binding)
`
})
(L’event Binding)
}
(L’event Binding)
Comme par magie, la méthode myValueChange est appelée à chaque fois qu'un
évènementcounterChange est reçu. A noter la possibilité de passer $event en
paramètre pour récupérer le contenu de l'évènement.
[(Le two-way Data Binding)]
Pour terminer cet article, je vais vous parler du two-way Data Binding. Ce mécanisme
permet, à partir d'une même notation, de modifier le modèle à partir du DOM et de
modifier le DOM à partir du modèle. Voici la syntaxe utilisée dans Angular pour déclarer
un tel Data Binding :
<ma-taille [(taille)] ></ma-taille>
72
[(Le two-way Data Binding)]
Il faut se souvenir que les parenthèses sont entre les crochets. Pour se souvenir de
cela, cette notation se nomme "banana in a box"… Cette banane dans une boite
rappelle ce que nous avons pu voir avec le Property Binding et l'event binding.
Effectivement, ce que nous venons de voir aurait pu également s'écrire :
73
[(Le two-way Data Binding)]
Nous pouvons dès lors en déduire que le code de notre component aura en @Input
nommé taille et un @output nommé tailleChange. Cela constitue donc la règle du Data
Binding 2-way : Si l'on considère la notation [(x)], x est la propriété à setter et xChange
est l'évènement lancé lors d'une modification de sa valeur. Cet évènement sera donc
intercepté par son component parent afin de récupérer cette valeur.
74
[(Le two-way Data Binding)]
[(Le two-way Data Binding)]
<input [(ngModel)]="prenom">
[(Le two-way Data Binding)]
@Component({
selector: 'app-root',
template: `
<div [align]="alignement" [ngStyle]="{color:couleur}">Personne : {{person}} | Age : {{age}} | Adresse : {{[Link]}}</div>
<app-comp1 [monAdresse]="address"></app-comp1>
<button (click)="modifierPersonne()">Modifier adresse</button>
`
})
4 La Pagination
81
La pagination
pagination : permet la d écoupage d’une liste en sous page pour devenir plus lisible
ngx pagination offre la solution la plus simple mais la plus puissante pour créer une
pagination dans Angular.
La pagination, également connue sous le nom de pagination, est le processus de division
d'un document en pages discrètes, soit des pages électroniques, soit des pages imprimées.
82
La pagination
Initialisation de page :
85
Les pipes
Les pipes sont des filtres utilisable directement depuis la vue afin de transformer les valeurs
lors du Binding.
Angular Pipes permet à ses utilisateurs de modifier le format dans lequel les données sont
affichées à l'écran.
86
Les pipes
Création de pipe ??
Exemple:
ng g p pipes/recherche
Une fois la commande est exécuté, deux fichiers sont créés:
87
Les pipes
Exemple:
Le fichier [Link] contient le code suivant.
88
Les pipes
Exemple:
Comme vous pouvez le voir, l'interface PipeTransform et la méthode de transformation ont
été créées. Nous l'avons mis en évidence pour une meilleure compréhension.
À des fins de démonstration, nous avons créé un pipe de filtrage par référence:
89
Les pipes
Exemple:
1. Modifier le fichier [Link]:
90
Les pipes
Exemple:
2. Modifier le fichier [Link] (on déclarant un variable search_name:any)
91
Les pipes
Exemple:
1. Modifier le fichier [Link]:
Faire l’appel à notre pipe :
92
6 Les directives
93
Les directives sont des classes qui ajoutent un nouveau
comportement ou modifient le comportement existant des
éléments du modèle.
94
Il existe deux sortes 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.
95
Les directives structurelles
Je ne vais pas lister toutes les directives structurelles proposées par Angular mais nous
allons quand même en étudier une pour l'exemple : ngIf ,ngFor.
ngIf permet de supprimer ou de recréer l'élément courant suivant l'expression passée en
paramètre.
Syntaxe:*ngIf="condition"
Les directives structurelles
Exemple:
Si l'expression assignée au ngIf est évaluée à false alors l'élément sera supprimé du
DOM, puis l'élément sera recréé si l'expression est évaluée à true. Voici un exemple
de template utilisant cette directive :
<div *ngIf="1 > 0"> Afficher la div</div>
Afficher la div sera bien affiché puisque l'expression 1 > 0 vaut bien true. Je
vous propose maintenant d'inverser le sens de l'expresssion de sorte que 1
< 0. Dans ce cas, notre div disparait totalement du DOM.
97
Les directives structurelles
Vous vous posez sans doute la question du symbole astérisque (*) devant notre
directive.
Les directives structurelles telles que *ngIf, *ngFor et *ngSwitchCase sont toutes
encadrées par un component <ng-template> qui se veut très proche de la balise HTML
5 <template> Dans la version 2 d'Angular, <ng-template> se nommait <template>, ce
qui pouvait être ambiguë. L'astérisque (*) permet de lire et d'écrire plus facilement des
directives qui ont vocation à changer la mise en page HTML.
Les directives structurelles
Prenons l'exemple de notre directive ngIf : lorsque Angular va détecter (*) devant *ngIf,
il va opérer différentes transformations pour arriver au résultat suivant :
<template [ngIf]="1 > 0">
<div> Afficher la div</div>
</template>
Notre directive ngIf sera donc maintenant un template HTML 5 et pourra interpréter
l'expression passée en paramètre grâce au Property Binding (usage des [ ]).
Les attributes directives
Une bonne candidate pour comprendre les attribute directives est la directive ngStyle. Cet
attribute directive se charge de modifier l'apparence de l'élément porteur. Lorsque l'on utilise
cette directive, il est nécessaire de la placer entre crochets comme ceci : [ngStyle] . Ce n'est
pas forcément le cas de toutes les d'attribute directives. ngStyle attend une valeur en
paramètre, elle utilise ce que l'on appelle le Property Binding que nous reverrons plus tard.
Voici un exemple de template utilisant cette directive :
<div [ngStyle]="{color:'red'}">Learn Angular</div>
Dans ce cas, il n'y a pas de modification de structure. La directive transforme juste notre
[ngStyle]="{color:'red'}" en style="color: red;".
Les attributes directives
101
Construire ses directives
Je vous propose maintenant de créer notre propre directive pour bien en comprendre
le fonctionnement. Voici notre cahier des charges :
Réaliser une directive qui permet de modifier la couleur lorsque le pointeur de la souris
passe dessus.
Commençons par créer notre directive à l'aide d'Angular-CLI à l'aide de la commande :
ng generate directive nomdirective
102
Création de notre Directive
Cela nous donne le code suivant pour notre directive:
Création de notre Directive
Pourquoi Angular-CLI ajoute des [ … ] à notre sélecteur ? Angular utilise les sélecteurs
CSS pour identifier l'élément HTML dans un template. Grâce à cette annotaion,
Angular sera capable de localiser tous les éléments qui possèdent l'attribut nommé
appHighLight.
La première étape consite à appliquer la couleur par défaut lorsque l'on applique cette
directive. Comme nous sommes dans une classe, nous pouvons utiliser le constructeur
comme ceci :
Création de notre Directive
105
Création de notre Directive
ElementRef est injecté dans le constructeur par Angular afin de récupérer l'élement du
DOM dans notre classe. Grace à cette injection, il est possible de modifier le style de
l'élement grace àRenderer2. Vous pouvez tester votre directive dans le template d'un de
vos Components comme ceci :
<div appHighlight>Texte en hightlight</div>
Ajouter du component grâce aux
events JavaScript
Lorsque le pointeur de la souris quitte l'élément : la couleur du texte doit redevenir rouge.
Angular propose le décorateur @HostListener pour positionner des Listners sur l'élément. Il
prend en paramètre l'évènement que l'on veut écouter.
Ajouter du component grâce aux
events JavaScript
client.