Formation AngularJS 101

By Nicolas CHALET - Extia - Juillet 2016

Qui suis-je ?


{
	"nom" : 'Nicolas',
	"prenom" : 'CHALET',
	"company" : 'Extia',
	"currentClient" : 'PMU',
	"profession" : 'Full-Stack software engineer',
	"centerOfInterests" : [
		'Web developpement',
		'Java/Javascript ♥♥♥',
		'Science',
		'Music player',
		'Video games'
	]
}
					

Et vous ?

  • Qui êtes vous ?
  • Les technos et languages que vous utilisez le plus ?
  • ... qui vous attirent le plus ?
  • Où en est-vous avec Angular ?

Programme de cette formation

  • Pourquoi AngularJS ?
  • Histoire d'AngularJS
  • Pattern MVVM
  • Two-Way Data-Binding
  • Modules
  • Controller
  • Filtres
  • Factory / Services
  • Provider
  • Directives
  • Components
  • Routing
  • Développons tout ça

Pourquoi AngularJS

  • Prise en main rapide et facile
  • Ordre et Structure
    • Architeture modulaire (=> Composants)
    • Évolutions simples
    • Lisibilité du code
    • Testabilité
  • Richesse de sa communauté

Histoire d'AngularJS

Angular 1

Concept apporté par Miško Hevery and Adam Abronsw en 2009

Arrivée sur GitHub en 2011
Première release 1.0.0 en juin 2012

Aujourd'hui version 1.5.7
> 50.000 étoiles sur GitHub


Angular 2

Release candidate 4 sortie depuis fin juin 2016
Presque 14.000 étoiles sur GitHub
Affaire à suivre ...

Pattern MVVM

Two-Way Data-Binding

Les différents composants AngularJS

  • Module
  • Controller
  • Filtres
  • Factory / Services / Providers
  • Directives
  • Components

Les modules

  • Un module est un conteneur de composants Angulars
  • Le point d'entrée d'une application Angular est un module
  • Il définit ses dépendances aux autres modules

Les modules

Cycle de vie d'un module

  1. Chargement des dépendances
  2. Execution des config blocks
  3. Création de l'injecteur
  4. Execution des run blocks
  5. ... puis fait sa vie (création d'un controlleur si on le lui demande, ...)

Les modules


// app.module.js
angular.module('moduleName', [ // <== Setter, déclaration du module
  'otherModule'                // <== Et de ses dépendances
]);

// app.filter.js
angular.module('moduleName')  // <== Getter, récupération de l'instance'
.filter('moduleFilter', function ModuleFilter() {
  // code
})

// app.controller.js
angular.module('moduleName')
.controller('ModuleController', function ModuleController() {
  // code
});
            

Les controlleurs

  • Le controlleur est le lien entre le modèle et la vue
  • Il est la source de confiance de la donnée
  • Il peux être utilisé dans
    • une directive
    • un composant
    • une route
    • ... des composants d'autres modules ...

Les controlleurs


{{'Hello, ' + moduleCtrl.firstname}}

// app.controller.js
angular.module('moduleName')
.controller('ModuleController', function ModuleController() {
  this.firstname = 'Nico';
  this.action = () => {
    console.log(this.firstname);
  };
});
            

Les filtres

  • Permet une opération sur un object / une collection / ...
  • Ne modifie pas la donnée d'origine
  • Utilisé principalement pour formatter avant affichage
  • Une bonne tripotée de filtres natifs dans Angular
    • currency
    • date
    • filter
    • json
    • limitTo
    • lowercase
    • number
    • orderBy
    • uppercase
    
    {{moduleCtrl.name | uppercase}}
                      

Les Filtres


Formation Angular: {{moduleCtrl.eventDate | date: 'dd/MM/YYYY'}}

// app.controller.js
angular.module('moduleName')
.controller('ModuleController', function ModuleController() {
  this.eventDate = '2016-07-11T10:30:00Z';
});
            

Résultat


Formation Angular: 11/07/2016
            

Les Filtres

Créer son propre filtre


angular.module('moduleName')
.filter('myUppercase', function() {
  return function (item) {
    return item.toUpperCase();
  }
})
.controller('ModuleController', function ModuleController() {
  this.username = 'Todd Motto';
});
            

User Name: {{moduleCtrl.username | myUppercase}}

Résultat


User Name: TODD MOTTO
            

Services, factories, providers

  • Les Services sont des singletons
  • Les Factories sont des services instanciés à chaque appels
  • Les Providers permettent l'instanciation d'un service, ils sont accessibles à la phase de config

Services, factories, providers


angular.module('moduleName')
.service('greetingsService', function() {
  this.sayHello = function(name) {
    console.log('Hello, ' + name);
  };
})
.factory('greetingsFactory', function() {
  return function(name) {
    var greetName = name || 'Default';
    return {
      sayHello = function(aName) {
        console.log('Hello, ' + aName || greetName);
      }
    };
  };
})
.provider('greetings', function() {
  this.$get = function() {
    return function() {
      this.sayHello = function(name) {
        console.log('Hello, ' + name);
      };
    };
  };
});
            

En action

Les Directives

  • Elles permettent d'enrichir de DOM
  • Elles permettent de factoriser des éléments graphiques
  • Des éléments très riches peuvent être abstraits par des directives simples
  • Un grand nombre de directives natives

Les Directives

La classique : ng-repeat

Controller :


this.items = ['John', 'Peter', 'Bruce'];
            

View :


  • {{item}}

Résultat :

  • John
  • Peter
  • Bruce

Les Directives

Comment en créer ?


angular.module('moduleName')
.directive('directiveName', function() {
  return {
    restrict     : 'A/E/C', // Attribute, element, className
    template     : '
... html code ...
', // Row html templateUrl : 'some/path/to.html', // Path to a template file scope : {}, // Attributes to use in the directive link : function(scope, attr, ele) {}, // bindings controller : function() {}, // External API controllerAs : 'ctrl' }; });

Les Components

  • S'inspire de la spec Web Component
  • Lifecyclehooks (onInit, onDestroy, ...)
  • Plus simple à migrer en Angular 2
  • Directives avec des propriétés de routing

Les Components


angular.module('moduleName')
.component('MyComponent', {
  template     : '
... html code ...
', // Row html templateUrl : 'some/path/to.html', // Path to a template file bindings : {}, // Attributes to use in the component controller : function () {}, // bindings controllerAs : 'ctrl' });

Let's Dive in !


gulp serve
            
http://localhost:3000