
Angular est un Framework open source écrit en JavaScript qui permet la création d’applications Web et plus particulièrement de ce qu’on appelle des « Single Page Applications » : des applications web accessibles via une page web unique qui permet de fluidifier l’expérience utilisateur et d’éviter les chargements.
Développé par Google, Angular est un Framework open source écrit en JavaScript qui permet la création d’applications Web et plus particulièrement de ce qu’on appelle des « Single Page Applications » : des applications web accessibles via une page web unique qui permet de fluidifier l’expérience utilisateur et d’éviter les chargements de pages à chaque nouvelle action. Le Framework est basé sur une architecture du type MVC et permet donc de séparer les données, le visuel et les actions pour une meilleure gestion des responsabilités. Un type d’architecture qui a largement fait ses preuves et qui permet une forte maintenabilité et une amélioration du travail collaboratif.
Loin de moi l’idée de faire du prosélytisme, ce n’est pas mon genre et je n’ai pas assez de recul et de connaissances sur les autres produits du marché pour m’aventurer là-dedans, mais je dois dire qu’Angular est un Framework solide, complet et homogène qui a l’avantage de ne pas nécessiter l’ajout de composants extérieurs pour son fonctionnement. Il est possible de faire nativement du routing, de l’AJAX ou encore du stockage en local contrairement à vue.js ou encore React qui reste au final une librairie destinée à développer des composants.
Aussi, le framework s’appuie sur Typescript, une surcouche au JavaScript développé par Microsoft, qui est un langage typé qui permet de créer des classes, des variables et des signatures de fonction. Et s’il est parfaitement possible d’utiliser du JavaScript natif avec Angular, l’utilisation de Typescript permet de mieux gérer les erreurs, d’avoir un code plus clair et aussi d’assurer une transition plus simple pour les développeurs PHP, Java ou encore C#.
Pour faire bref, le TypeScript est un sur-ensemble (un “superset”) de JavaScript qui est justement transcompilé (transcompilation : “traduction” d’un langage de programmation vers un autre – différent de la compilation, qui transforme généralement le code vers un format exécutable) en JavaScript pour être compréhensible par les navigateurs. Il ajoute des fonctionnalités extrêmement utiles, comme, entre autres :
le typage strict, qui permet de s’assurer qu’une variable ou une valeur passée vers ou retournée par une fonction soit du type prévu ;
les fonctions dites lambda ou arrow, permettant un code plus lisible et donc plus simple à maintenir ;
les classes et interfaces, permettant de coder de manière beaucoup plus modulaire et robuste.
Le CLI, ou “Command Line Interface” (un outil permettant d’exécuter des commandes depuis la console), 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.
Vous devez installer les outils suivants si vous ne les avez pas déjà sur votre machine :
NODE.JS
Téléchargez et installez la dernière version LTS de Node.js ici :
https://nodejs.org/en/download/
NPM
NPM est un package manager qui permet l’installation d’énormément d’outils et de libraries dont vous aurez besoin pour tout type de développement. Pour l’installer, ouvrez une ligne de commande et tapez la commande suivante :
npm install -g npm@latest
ANGULAR/CLI
Vous allez maintenant installer le CLI d’Angular de manière globale sur votre machine avec la commande suivante (avec sudo si besoin) :
npm install -g @angular/cli
À partir de là, la commande ng est disponible depuis la ligne de commandes depuis n’importe quel dossier de l’ordinateur.
Pour créer un nouveau projet Angular, naviguez vers le dossier souhaité depuis une ligne de commande et saisissez la commande suivante :
ng new mon-premier-projet
Ensuite, naviguez dans le dossier du projet et lancez le serveur de développement :
cd mon-premier-projet ng serve --open
Si tout se passe bien, vous verrez les informations du serveur qui se lance à l’adresse localhost:4200 et votre navigateur préféré se lancera automatiquement avec le message “Welcome to app!!” et le logo Angular.
Félicitations, votre environnement de développement est prêt !
Tout d’abord, créez un nouveau projet sur lequel vous travaillerez tout au long des chapitres suivants. Depuis une ligne de commandes, naviguez vers votre dossier cible et tapez la commande suivante :
ng new mon-projet-angular --style=scss --skip-tests=true.
Le premier flag (élément de la commande suivant un double tiret –) crée des fichiers .scss pour les styles plutôt que des fichiers .css . Le second flag annule la création des fichiers test. Maintenant vous pouvez ouvrir le dossier mon-projet-angular depuis votre éditeur. Avant de plonger dans les différents dossiers, vous allez exécuter une commande pour installer Bootstrap dans votre projet. Depuis le dossier mon-projet-angular , avec une ligne de commande, tapez :
npm install bootstrap@3.3.7 --save.Les components sont les composantes de base d’une application Angular : une application est une arborescence de plusieurs components.
Imaginez la page web suivante :

Tout d’abord, notre AppComponent est notre component principal : tous les autres components de notre application seront emboîtés ou “nested” dans celui-ci.
Pour cette structure, on peut imaginer un component pour la barre de menu, un autre pour la partie contenu et un dernier pour le menu à droite. Il n’y a pas de règle d’or : je vous montrerai au cours des chapitres suivants comment réfléchir à votre structure afin de trouver la séparation des components la plus pertinente.
Vous allez maintenant créer un nouveau component à l’aide du CLI d’Angular. Depuis le dossier principal de votre projet, tapez la commande suivante :
ng generate component mon-premier

Comme vous le constaterez, le CLI a créé un nouveau sous-dossier mon-premier et y a créé un fichier template, une feuille de styles, un fichier component et un fichier spec : il s’agit d’un fichier de test que vous pouvez supprimer, car vous ne vous en servirez pas dans le cadre de ce cours.
Le databinding, c’est la communication entre votre code TypeScript et le template HTML qui est montré à l’utilisateur. Cette communication est divisée en deux directions :
les informations venant de votre code qui doivent être affichées dans le navigateur, comme par exemple des informations que votre code a calculé ou récupéré sur un serveur. Les deux principales méthodes pour cela sont le “string interpolation” et le “property binding” ;
les informations venant du template qui doivent être gérées par le code : l’utilisateur a rempli un formulaire ou cliqué sur un bouton, et il faut réagir et gérer ces événements. On parlera de “event binding” pour cela.
Il existe également des situations comme les formulaires, par exemple, où l’on voudra une communication à double sens : on parle donc de “two-way binding”.
Pour votre application des appareils électriques, imaginez que si l’utilisateur est authentifié, on lui laisse la possibilité d’allumer tous les appareils de la maison. Puisque l’authentification est une valeur globale, ajoutez une variable boolean dans AppComponent , votre component de base (vous pouvez supprimer la variable title puisque vous ne l’utilisez plus) :import { Component } from ‘@angular/core’;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
isAuth = false;
}Les directives sont des instructions intégrées dans le DOM que vous utiliserez presque systématiquement quand vous créerez des applications Angular. Quand Angular lit votre template et rencontre une directive qu’il reconnait, il suit les instructions correspondantes.
Il existe deux types principaux de directive : les directives structurelles et les directives par attribut.
Ce sont des directives qui, comme leur nom l’indique, modifient la structure du document. Dans ce chapitre, vous allez en découvrir deux (il en existe d’autres) : *ngIf , pour afficher des données de façon conditionnelle, et *ngFor , pour itérer des données dans un array, par exemple.
Un component auquel on ajoute la directive *ngIf="condition" ne s’affichera que si la condition est “truthy” (elle retourne la valeur true où la variable mentionnée est définie et non-nulle), comme un statement if classique.
Pour une démonstration simple, ajoutez une <div> rouge qui ne s’affichera que si l’appareil est éteint :
<li class="list-group-item">
<div style="width:20px;height:20px;background-color:red;"
*ngIf="appareilStatus === 'éteint'"></div>
<h4>Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}</h4>
<input type="text" class="form-control" [(ngModel)]="appareilName">
</li>Lorsque l’on ajoute la directive *ngFor="let obj of myArray" à un component, Angular itérera l’array myArray et affichera un component par objet obj . Pour en comprendre l’utilisation, je vous propose de modifier la façon dont votre application génère des appareils électriques.
On peut imaginer que votre application récupère, depuis un serveur, un array contenant tous les appareils et leurs états. Pour l’instant, créez cet array directement dans AppComponent :
export class AppComponent {
isAuth = false;
appareils = [
{
name: 'Machine à laver',
status: 'éteint'
},
{
name: 'Frigo',
status: 'allumé'
},
{
name: 'Ordinateur',
status: 'éteint'
}
];Vous avez un array avec trois objets, chaque objet ayant une propriété name et une propriété status . Vous pourriez même créer une interface ou une class TypeScript Appareil , mais dans ce cas simple ce n’est pas nécessaire.
Maintenant la magie *ngFor :
<div class="container">
<div class="row">
<div class="col-xs-12">
<h2>Mes appareils</h2>
<ul class="list-group">
<app-appareil *ngFor="let appareil of appareils"
[appareilName]="appareil.name"
[appareilStatus]="appareil.status"></app-appareil>
</ul>
<button class="btn btn-success"
[disabled]="!isAuth"
(click)="onAllumer()">Tout allumer</button>
</div>
</div>
</div>Le statement let appareil of appareils , comme dans une for loop classique, itère pour chaque élément appareil (nom arbitraire) de l’array appareils . Après cette directive, vous pouvez maintenant utiliser l’objet appareil , dont vous connaissez la forme, à l’intérieur de cette balise HTML. Vous pouvez donc utiliser le property binding, et y passer les propriétés name et status de cet objet.
À la différence des directives structurelles, les directives par attribut modifient le comportement d’un objet déjà existant. Vous avez déjà utilisé une directive de ce type sans le savoir : la directive ngModel que vous avez employée pour le two-way binding, qui modifie la valeur du <input> et répond à tout changement qu’on lui apporte. Je vais vous montrer deux autres exemples très utiles : ngStyle et ngClass , qui permettent d’attribuer des styles ou des classes de manière dynamique.
Cette directive permet d’appliquer des styles à un objet du DOM de manière dynamique. Imaginez que, pour l’application des appareils électriques, vous souhaitiez modifier la couleur du texte selon si l’appareil est allumé ou non, disons vert pour allumé, rouge pour éteint. ngStyle vous permet de faire cela :
ngStyle prend un objet JS de type clé-valeur, avec comme clé le style à modifier, et comme valeur la valeur souhaitée pour ce style. Ici, vous faites appel à une fonction getColor() dans AppareilComponent que vous allez maintenant créer :
getColor() {
if(this.appareilStatus === 'allumé') {
return 'green';
} else if(this.appareilStatus === 'éteint') {
return 'red';
}
}'green' si l’appareil est allumé, et 'red' s’il est éteint, modifiant ainsi la couleur du texte dans le template.Au-delà de modifier des styles directement, il peut être très utile d’ajouter des classes CSS à un élément de manière dynamique. Comme ngStyle , ngClass prend un objet clé-valeur, mais cette fois avec la classe à appliquer en clé, et la condition en valeur.
Pour cet exemple, je vous propose d’appliquer des classes Bootstrap à la balise <li> en fonction du statut de l’appareil :
<li [ngClass]="{'list-group-item': true,
'list-group-item-success': appareilStatus === 'allumé',
'list-group-item-danger': appareilStatus === 'éteint'}">
<div style="width:20px;height:20px;background-color:red;"
*ngIf="appareilStatus === 'éteint'"></div>
<h4 [ngStyle]="{color: getColor()}">Appareil : {{ appareilName }} -- Statut : {{ getStatus() }}</h4>
<input type="text" class="form-control" [(ngModel)]="appareilName">
</li>Angular appliquera donc systématiquement la classe list-group-item , et selon le contenu de la variable appareilStatus , appliquera l’une ou l’autre des deux autres classes. Vous pouvez bien évidemment créer vos propres classes et les utiliser ; j’ai simplement choisi des classes Bootstrap pour simplifier l’explication.
Dans AngularJS, un service est une fonction, ou un objet, disponible et limité à votre application AngularJS.
AngularJS a environ 30 services intégrés. L’un d’eux est le $location service.
Le $locationservice dispose de méthodes qui renvoient des informations sur l’emplacement de la page Web actuelle:
Utilisez le $locationservice dans un contrôleur:
var app = angular.module('myApp', []);
app.controller('customersCtrl', function($scope, $location) {
$scope.myUrl = $location.absUrl();
});Pour de nombreux services, comme le $locationservice, il semble que vous puissiez utiliser des objets qui sont déjà dans le DOM, comme l’ window.location objet, et vous le pouvez, mais cela aurait certaines limitations, au moins pour votre application AngularJS.
AngularJS supervise constamment votre application, et pour qu’elle gère correctement les changements et les événements, AngularJS préfère que vous utilisiez le $location service au lieu de l’ window.locationobjet.
Pour créer votre propre service, connectez votre service au module:
Créez un service nommé hexafy:
app.service('hexafy', function() {
this.myFunc = function (x) {
return x.toString(16);
}
});
Pour utiliser votre service personnalisé, ajoutez-le en tant que dépendance lors de la définition du contrôleur:
Utilisez le service personnalisé nommé hexafypour convertir un nombre en nombre hexadécimal:
app.controller('myCtrl', function($scope, hexafy) {
$scope.hex = hexafy.myFunc(255);
});Les formulaires dans AngularJS fournissent la liaison de données et la validation des contrôles d’entrée.
Les contrôles d’entrée sont les éléments d’entrée HTML:
Les contrôles d’entrée fournissent une liaison de données à l’aide de la ng-modeldirective.
<input type=”text” ng-model=”firstname”>L’application a maintenant une propriété nommée firstname.
La ng-modeldirective lie le contrôleur d’entrée au reste de votre application.
La propriété firstname, peut être référencée dans un contrôleur:
<script>
var app = angular.module('myApp', []);
app.controller('formCtrl', function($scope) {
$scope.firstname = "John";
});
</script>
Le ngRoutemodule aide votre application à devenir une application à page unique.
Si vous souhaitez naviguer vers différentes pages de votre application, mais que vous souhaitez également que l’application soit une SPA (application à page unique), sans rechargement de page, vous pouvez utiliser le ngRoutemodule.
Le ngRoutemodule achemine votre application vers différentes pages sans recharger l’ensemble de l’application.
Accédez à “red.htm”, “green.htm” et “blue.htm”:
<body ng-app="myApp">
<p><a href="#/!">Main</a></p>
<a href="#!red">Red</a>
<a href="#!green">Green</a>
<a href="#!blue">Blue</a>
<div ng-view></div>
<script>
var app = angular.module("myApp", ["ngRoute"]);
app.config(function($routeProvider) {
$routeProvider
.when("/", {
templateUrl : "main.htm"
})
.when("/red", {
templateUrl : "red.htm"
})
.when("/green", {
templateUrl : "green.htm"
})
.when("/blue", {
templateUrl : "blue.htm"
});
});
</script>
</body>
| L | M | M | J | V | S | D |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | |||||