Je vous propose dans ce billet quelques réflexions sur mes premiers pas avec AngularJS (voir aussi billet sur mes activités de l'été).
Prise en main
Pour commencer, j'ai trouvé la prise en main d'AngularJS très aisée, la documentation est bien faite (bien que le site soit un peu lent). Le cours CodeSchool m'a permis de mettre le pied à l'étrier de manière efficace.
Pour résumer, voici ce qu'il faut comprendre à mon avis pour commencer (retrouver ces points dans l'historique des commits sur le site du LyonTechHub) :
- Les modules et leurs dépendances à d'autres modules, utile pour modulariser l'application
1: 2: 3: |
|
- Les directives (standards et personnalisées), le binding et les filtres pour agrémenter le dev Web, une sorte de "super HTML" (cf. https://docs.angularjs.org/api/ng/directive et https://docs.angularjs.org/api/ng/filter), voici quelques exemples :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: |
|
- Voici comment déclarer une directive personnalisée par exemple (cf. https://code.angularjs.org/1.2.24/docs/guide/directive pour plus de détails)
1: 2: 3: 4: 5: 6: 7: |
|
- Le routing pour gérer plusieurs pages (module ngRoute séparé depuis la version 1.2 d'AngularJS)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: |
|
- Les controlleurs (ou View Models, cf. ci-dessous)
1: 2: 3: 4: 5: 6: |
|
- Les services (standards et personnalisés), cf. https://docs.angularjs.org/api/ng/service (les services standards sont préfixés par un $)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: |
|
Bien évidemment, AngularJS ne se résume pas à ça, mais les grandes lignes (de la v1.3) sont là si je ne me trompe pas. Avec ça, vous êtes bien armés pour attaquer tout le reste. Le tutoriel et le guide du développeur sont bien fait.
Les "controlleurs" ou View Models
Avant la version 1.2 d'AngularJS, les controlleurs avaient $scope injecté systématiquement afin (notamment) de fournir les données à la vue pour le binding. Par exemple :
1: 2: 3: |
|
Depuis la version 1.2, la syntaxe appelée "controllerAs" a été introduite. Les controlleurs n'ont plus à avoir $scope pour passer des données à la vue, ils portent les données à binder.
1: 2: 3: |
|
Vous noterez que du coup j'ai nommé mon controlleur ViewModel plutôt que Controller, car à mes yeux on est alors plus dans un pattern MVVM (Model-View-ViewModel) que dans un pattern MVC (Model-View-Controller). En effet, définir un état pour un Controller m'a paru un peu "choquant", et surtout ça ressemble tellement à un ViewModel que je ne vois pas l'intérêt de créer la confusion en l'appelant Controller. Aussi, ça se rapproche ainsi beaucoup de concepts vus dans WPF ou Knockout. Bref, je pinaille sur des concepts, d'ailleurs AngularJS a pris le parti de dire que c'est un framework MVW, où W signifie Whatever :), c'est-à-dire ce qu'on veut : Controller ou ViewModel ou autre...
Au passage, je trouve cette notation "controllerAs" plus légère et moins "je fourre tout dans $scope". C'est d'ailleurs aussi l'avis de Todd Moto, dont je vous recommande les conventions de code AngularJS : https://github.com/toddmotto/angularjs-styleguide/.
La faible intrusivité du framework dans les View Models
Un dernier point qui m'a marqué est la faible intrusivité du framework au niveau des ViewModels (ou Controller, vous avez compris). En effet, je connaissais Knockout où chaque propriété pour laquelle on souhaite faire un databinding dynamique (c'est-à-dire si la valeur change en JS, la valeur affichée change aussi), il est nécessaire de le déclarer en tant que ko.observable() ou ko.observableArray(), puis d'utiliser une fonction pour définir (set) ou récupérer (get) la valeur de la propriété. Je trouve cette notation un peu lourde dans Knockout, j'ai donc bien apprécié la syntaxe AngularJS.
A noter que pour Knockout, vous pouvez rajouter un plugin pour éviter cette notation. Attention, cela nécessite un navigateur implémentant ECMAScript5, soit au moins IE9 dans la famille IE...
Voilà, jetez un oeil à AngularJS, c'est une corde à son arc qui est toujours intéressante d'avoir en ce moment.