Ce document rend compte des travaux pratiques réalisés sur AngularJS, un framework MVC côté client développé par Google. Comme indiqué dans le cours, AngularJS représente un "grand bond vers le futur de HTML", permettant de créer des applications web modernes à page unique (SPA). L'objectif est d'appréhender la "pensée MVC" (Modèle-Vue-Contrôleur).
Une bonne organisation est essentielle pour maintenir la logique applicative séparée de la vue.
Figure 7 : Vue globale du dossier de travail
Figure 8 : Séparation des fichiers HTML (Vue) et JS (Contrôleur)
Initialiser une application AngularJS et comprendre le système de template via l'interpolation.
Nous utilisons la directive racine ng-app pour définir la portée de l'application. L'affichage repose sur le système de template "handlebars" {{ }}.
Angular analyse le DOM à la recherche de directives. Lorsqu'il rencontre une expression mathématique comme {{ 2 + 3 }}, il l'évalue dynamiquement et injecte le résultat dans la Vue.
Figure 1 : Interprétation dynamique des expressions mathématiques
Mettre en œuvre le pattern MVC (Modèle-Vue-Contrôleur) et le Data-Binding bidirectionnel.
ng-controller, il agit comme le "messager" entre le serveur/données et la vue.
Grâce à la directive ng-model, nous lions le champ de saisie (Vue) à une variable du $scope (Contrôleur).
Toute modification de l'input met à jour le modèle en temps réel, ce qui rafraîchit instantanément l'affichage du texte "Hello..." dans le DOM.
$scope apporte une notion de "publique/privé" au JavaScript, limitant la logique à l'élément DOM courant.
Figure 2 : Binding bidirectionnel (Two-way binding)
$scope.
Structurer l'application proprement en encapsulant la logique dans un Module dédié, évitant ainsi de polluer l'espace global.
Nous utilisons la déclaration de module recommandée par le cours :
var myApp = angular.module('myApp', []);.
Le module agit comme un conteneur pour les différents composants de l'application (Contrôleurs, Services, Filtres).
La directive ng-app="myApp" lie le HTML à ce module spécifique.
Figure 3 : Instanciation de l'application via un Module
Manipuler des données via des actions utilisateur (clics) et mettre à jour le modèle.
Utilisation de la directive ng-click pour lier les boutons HTML à des fonctions définies dans le $scope du contrôleur.
Le contrôleur contient la logique métier (addition, multiplication).
Bien que nous ayons placé cette logique dans le contrôleur pour cet exercice, le cours précise que pour des fonctionnalités complexes et réutilisables (ex: une fonction multiply), il serait préférable d'utiliser un Service.
Le service est un "design pattern" singleton idéal pour partager de la logique.
Figure 4 : Interactivité gérée par ng-click
Gérer plusieurs instances de contrôleurs sur une même page.
Création de deux contrôleurs distincts : Math1 et Math2.
Chaque directive ng-controller crée une nouvelle instance de scope.
Le $scope encapsule les données pour qu'elles soient "limitées à l'élément".
Ainsi, la variable result du premier contrôleur n'écrase pas celle du second. C'est le principe d'isolation des composants.
Figure 5 : Isolation des scopes via multiples contrôleurs
Mettre à jour le scope Angular depuis un événement JavaScript externe (hors du framework).
Utilisation de angular.element().scope() pour récupérer le scope et de la méthode critique $apply().
Angular surveille automatiquement les changements qui se produisent dans son propre contexte (via ng-click, ng-model).
Cependant, lorsqu'un événement vient de l'extérieur (ex: un bouton standard JS), Angular n'est pas "averti".
Il faut utiliser $apply() pour forcer le cycle de digestion (digest cycle) et rafraîchir la Vue.
Figure 6 : Appel externe avec rafraîchissement manuel du Scope
À travers ces TP, j'ai acquis une compréhension solide de l'architecture MVC côté client. Je sais désormais :
angular.module.$scope pour injecter des données JSON dans le DOM.Bien qu'AngularJS (v1) ait posé les bases des frameworks SPA modernes, l'écosystème a évolué :
Cependant, la logique apprise ici (Data-binding, séparation des responsabilités) reste universelle dans le développement Front-End.