angular 2 par cyril balit & douglas duteil

55
READY FOR ANGULAR 2 ? @cbalit @douglasduteil

Upload: sfeir

Post on 09-Jan-2017

1.729 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Angular 2 par Cyril Balit & Douglas Duteil

READY FOR ANGULAR 2 ?

@cbalit @douglasduteil

Page 2: Angular 2 par Cyril Balit & Douglas Duteil

Angular 2 est encore en Alpha, ainsi la syntaxe présentée ici est sujet à être changée et | ou simplifiée

Disclaimer

Page 3: Angular 2 par Cyril Balit & Douglas Duteil

Il était une fois un framework...

Page 4: Angular 2 par Cyril Balit & Douglas Duteil

Angular

Créé par Miško Hevery et Adam AbronswPremière version le 30 juin 2011 (2009)Version actuelle 1.4.6 (17 septembre 2015)

Page 5: Angular 2 par Cyril Balit & Douglas Duteil

Des milliers d’applications en production:

https://www.madewithangular.com/

https://github.com/angular/angular.js/wiki/Projects-using-AngularJS

Page 6: Angular 2 par Cyril Balit & Douglas Duteil

Frameworks MVC mais

Page 7: Angular 2 par Cyril Balit & Douglas Duteil

Architecture

Page 8: Angular 2 par Cyril Balit & Douglas Duteil

Les ressources

■ angular-ui (composants boostrap , router…)■ restangular■ angular-strap■ angular translate■ ng-table■ angular-file-upload

Page 9: Angular 2 par Cyril Balit & Douglas Duteil

OK

■ Productivité■ Orienté Tests (l’injection de dépendances et les modules)■ Orienté service (découplage)■ Les templates en HTML■ Communauté

Page 10: Angular 2 par Cyril Balit & Douglas Duteil

KO

■ Dirty checking (boite noire)■ Performance■ Pas de rendering coté serveur : SEO :(■ Syntaxe parfois éxotique (Services, directives…)■ L’annonce de la version 2.0

Page 11: Angular 2 par Cyril Balit & Douglas Duteil

La communication

Page 12: Angular 2 par Cyril Balit & Douglas Duteil

Ng-Europe le 23 octobre 2014

Page 13: Angular 2 par Cyril Balit & Douglas Duteil

L’incertitude

“On va pas le coder en Angular c’est mort votre truc”- M. X -

Page 14: Angular 2 par Cyril Balit & Douglas Duteil

Ok on recommence...

● Maintenance de la 1.X (2018)● Ng-conf le 5 mars 2015● Migration progressive (new Router, ng-upgrade)● Adoption de TypeScript et partenariat avec Microsoft

source : http://angularjs.blogspot.fr/2015/08/angular-1-and-angular-2-coexistence.html

Page 15: Angular 2 par Cyril Balit & Douglas Duteil

Perspectives

■ Reboot complet■ Supprime

■ les scopes■ les controlleurs■ DDO■ Modules

Page 16: Angular 2 par Cyril Balit & Douglas Duteil

Les objectifs

■ mobile first■ Performance■ TypeScript■ Simplicité■ Standards: ES6, Web components■ ...

ref: https://angular.io/features.html

Page 17: Angular 2 par Cyril Balit & Douglas Duteil

Les performances

“Today, Angular2 is 5x faster than Angular 1” Misko, 02/10/15

Deep Tree Benchmark 2015-02-09

Page 18: Angular 2 par Cyril Balit & Douglas Duteil

Go...

Page 19: Angular 2 par Cyril Balit & Douglas Duteil

Librairies tiers

■ System.js■ universel (ES6

module, AMD, Common..)

■ importe notre application

■ es6-shim.js■ transpile to ES5

<!DOCTYPE html>

<html>

<head>

<script src="es6-shim.js"></script>

<script src="system.js"></script>

<script src="angular2.dev.js"></script>

</head>

<body>

<my-app></my-app>

<script>

System.import('app');

</script>

</body>

</html>

Page 20: Angular 2 par Cyril Balit & Douglas Duteil

Le langage

■ Typescript■ ES6■ types■ annotations

■ Javascript■ ES6■ ES5

@Component({ selector: 'my-app'

})

@View({

template: '<h1 id="output">My First Angular 2 App</h1>'

})

class AppComponent { }

var AppComponent = ng.Component({

selector: 'my-app'

})

.View({

template: '<h1 id="output">My First Angular 2 App</h1>'

})

.Class({

constructor: function () { }

});

Page 21: Angular 2 par Cyril Balit & Douglas Duteil

Démarrage de notre application

■ Import■ Définition d’un composant ■ boostrap

import {Component, View, bootstrap} from 'angular2/angular2';

@Component({

selector: 'my-app'

})

@View({

template: '<h1 id="output">My First Angular 2 App</h1>'

})

class AppComponent { }

bootstrap(AppComponent);

Page 22: Angular 2 par Cyril Balit & Douglas Duteil

Les composants

Page 23: Angular 2 par Cyril Balit & Douglas Duteil

Simplification

Plus de controller, de scope… mais 2 types de composants:

■ Qui ajoutent un comportement au DOM: les directives■ Qui encapsulent une vue: les components■ Les service seront de simples classes

Page 24: Angular 2 par Cyril Balit & Douglas Duteil

Un composant

■ Une classe ■ utilise la syntaxe de

classe ES6■ implémentation du

composant■ Ce que verra la vue

class AppComponent {

name:string;

constructor(){

this.name='Cyril';

}

}

Page 25: Angular 2 par Cyril Balit & Douglas Duteil

Un composant

■ les annotations ■ component pour

associer une composant à un sélecteur

■ view pour indiquer comment le composant s’affiche

@Component({

selector: 'my-app'

})

@View({

template: '<h1 id="output">My First Angular 2 App</h1>'

})

class AppComponent {

name:string;

constructor(){

this.name='Cyril';

}

}

Page 26: Angular 2 par Cyril Balit & Douglas Duteil

Un composant

■ importer les dépendances

import {Component, View} from 'angular2/angular2';

@Component({

selector: 'my-app'

})

@View({

template: '<h1 id="output">My First Angular 2 App</h1>'

})

class AppComponent {

name:string;

constructor(){

this.name='Cyril';

}

}

Page 27: Angular 2 par Cyril Balit & Douglas Duteil

Simplification : les directives

Plus de scope isolé, de restriction, de transclusion, de compile/link….

Page 28: Angular 2 par Cyril Balit & Douglas Duteil

Une directive

■ Annotation dédiéeimport {Directive} from 'angular2/angular2';

@Directive({

})

export class MyDirective {

}

Page 29: Angular 2 par Cyril Balit & Douglas Duteil

Une directive : plus de restrict

■ invocations possibles : un selecteur

■ element-name: pour restreindre à un élément

■ [attribute]: pour restreindre à un attribut

■ .class: pour restreindre à une classe

■ [attribute=value]: restreint à un attribut avec une certaine valeur

■ :not(sub_selector): si l’élément ne match pas le sous-sélecteur

import {Directive} from 'angular2/angular2';

@Directive({

selector: '[my-directive]'})

export class MyDirective {

}

Page 30: Angular 2 par Cyril Balit & Douglas Duteil

Une directive : plus de scope isolé

■ Properties■ Paires de key-value■ directiveProperty/bindi

ngProperty

import {Directive} from 'angular2/angular2';

@Directive({

selector: '[my-directive]',

properties: [directiveProperty: bindingProp],})

export class MyDirective {

}

Page 31: Angular 2 par Cyril Balit & Douglas Duteil

Une directive

■ Event■ Propager des

évènements custom■ écoute des

événements sur l’host

import {Directive} from 'angular2/angular2';

@Directive({

selector: '[my-directive]',

properties: [directiveProperty: bindingProp],

hostListeners: {'click':'onClick($event)'}})

export class MyDirective {

somethingChange: EventEmitter;

constructor(){

this.somethingChange = new EventEmitter();

}

onClick($event) {

this.somethingChange.next({$event, data});

}

}

Page 32: Angular 2 par Cyril Balit & Douglas Duteil

Une directive

■ Pour l’utiliser■ l’importer: plus de

collision de noms■ déclarer la directive

dans l’annotation View■ L’utiliser dans le

template

import {Component, View} from 'angular2/angular2';

import {MyDirective} from 'path/to/MyDirective';

@Component({

...

})

@View({

directives: [MyDirective],

template: '<h1 my-directive></h1>'

})

class AppComponent {

...

}

Page 33: Angular 2 par Cyril Balit & Douglas Duteil

Un service

■ Une simple classe■ On récupère le service par

injection de dépendanceimport {MyService} from 'path/to/MyService';

@Component({

...

})

@View({

...

})

class AppComponent {

constructor(@Inject(MyService) myService) {

myService.myMethod();

}

}

export class MyService {

myMethod() {}

}

Page 34: Angular 2 par Cyril Balit & Douglas Duteil

Le template

Page 35: Angular 2 par Cyril Balit & Douglas Duteil

Simplification : templating

Properties, events et références

Page 36: Angular 2 par Cyril Balit & Douglas Duteil

3 types de binding

Page 37: Angular 2 par Cyril Balit & Douglas Duteil

Event et properties:

■ Lisibilité■ Event et propriété sont l’API public d’un

composant■ parent -> enfant : property binding■ enfant -> parent : event binding■ Mixe des 2 pour du two-way bindings:

[(ng-model)]

[Property] (Event)

CHILD

PARENT

Page 38: Angular 2 par Cyril Balit & Douglas Duteil

Templating avancé

■ Importer les diectives■ Les déclarer■ Dans le template

import {CORE_DIRECTIVES} from 'angular2/angular2';

@View({

directives: [CORE_DIRECTIVES],

})

class AppComponent {

fruits:[{name:’apple’},{name:’banana’}];

}

<ul>

<li *ng-for="#fruit of fruits; #i=index">

{{ i }} : {{ fruit.name }}

</li>

</ul>

<div *ng-if="isAdmin">Edit</div>

Page 39: Angular 2 par Cyril Balit & Douglas Duteil

Pipes: Transformer de la donnée

■ Pipes natifs■ currency■ date■ lowercase, uppercase■ limitTo■ asynch■ json■ decimal■ percent

■ Pipe custom

import {Pipe} from 'angular2/angular2';

@Pipe({

name: ‘mypipe’,

})

class MyPipe {

transform(value,args){

return newValue;

}

}

<div>{{data | mypipe:arg1:arg2}}</div>

Page 40: Angular 2 par Cyril Balit & Douglas Duteil

Routes

Page 41: Angular 2 par Cyril Balit & Douglas Duteil

Boostrap

Récupérer les dépendances du Router et les intégrer dans notre injecteur

import {ROUTER_PROVIDERS, bootstrap} from 'angular2/angular2';

import {App} from 'ts/app/app';

bootstrap(App,[ROUTER_PROVIDERS]);

Page 42: Angular 2 par Cyril Balit & Douglas Duteil

Configuration

■ RouterConfig■ path: l’url associée■ as: alias pour la route

utilisé pour référencer les routes dans le HTML

■ component: nom du composant à associer à la route

import {RouteConfig, Router} from 'angular2/router'

@View({

directives:[ROUTER_DIRECTIVES]

})

@RouteConfig([

{ path: '/first, as: 'FirstComponent', component: FirstComponent},

])

export class App {

...

}

Page 43: Angular 2 par Cyril Balit & Douglas Duteil

Paramètres

■ Dans le path après ‘:’■ accessibles via RouteParams injecté dans le composant

@RouteConfig([

{ path: '/second/edit/:id', as: 'SecondComponent', component: SecondComponent}

])

class App {

constructor(@Inject(RouteParams) routeParams) {

this.id = routeParams.get('id');}

Page 44: Angular 2 par Cyril Balit & Douglas Duteil

Directives

■ router-link■ router-outlet

<a [router-link]="['/firstComponent']">FirstComponent</a><a [router-link]="['/SecondComponent',{id:obj.id}]">SecondComponent</a>

<section class="container"> <router-outlet></router-outlet></section>

Page 45: Angular 2 par Cyril Balit & Douglas Duteil

L’injection de dépendances

Page 46: Angular 2 par Cyril Balit & Douglas Duteil

Angular 1

■ Identifié par un nom■ Que des singletons■ Toujours synchrones■ Collision de noms■ Intrinsèque au framework

myModuleApp.factory("CountService", function (dep1, dep2, ...) {

return {

increment : function(){

}

};

});

function myController($scope, CountService){

CountService.increment();

};

Page 47: Angular 2 par Cyril Balit & Douglas Duteil

Le principe

■ L’injector expose l’API pour créer des instances de dépendances■ Le Provider indique à l’injector comment créer la dépendance■ La dépendance est le type d’objet à créer

Page 48: Angular 2 par Cyril Balit & Douglas Duteil

Récupérer une dépendance

■ Singleton■ Pour avoir des instances

■ Utiliser une factory■ Créer un injector fils

import { Injector } from 'angular2/di';

var injector = Injector.resolveAndCreate([

Car,

Engine,

Tires,

Doors

]);

var car = injector.get(Car);

Page 49: Angular 2 par Cyril Balit & Douglas Duteil

Le provider

■ Fait le lien entre un TOKEN et une FACTORY

■ Permet de découpler dépendance et implémentation

■ API pour:■ binder à une simple

valeur:■ faire des alias de token■ créer des factory

provide(String, {useValue: 'Hello World'})

provide(Engine, {useClass: Engine})provide(V8, {useExisting: Engine})

provide(Engine, {useFactory: () => {

return function () {

if (IS_V8) {

return new V8Engine();

} else {

return new V6Engine();

}

}

}})

Page 50: Angular 2 par Cyril Balit & Douglas Duteil

Injector fils

■ crée avec Injector.createAndResolveChild()

■ Au niveau de chaque composant

■ Ces instances seront alors différentes

■ Remontent la chaîne pour résoudre les dépendances

Page 51: Angular 2 par Cyril Balit & Douglas Duteil

Alors ?

Page 52: Angular 2 par Cyril Balit & Douglas Duteil

■ Orientation composant■ Simplification■ Typescript, ES6■ Stabilisation API/concepts (universalité)■ Préparer la transition

http://angularjs.blogspot.fr/2015/08/angular-1-and-angular-2-coexistence.htmlhttp://blog.thoughtram.io/angular/2015/10/24/upgrading-apps-to-angular-2-using-ngupgrade.html

■ Application complexes ?

Page 53: Angular 2 par Cyril Balit & Douglas Duteil

Pour en savoir plus

Sfeir School Angular 2

[email protected]

Page 54: Angular 2 par Cyril Balit & Douglas Duteil

Ressources

● Site Officiel : https://angular.io/● API : https://angular.io/docs/js/latest/api/● Thoughtram Blog : http://blog.thoughtram.io/categories/angular-2/● Overview: http://angular-tips.com/blog/2015/06/why-will-angular-2-rock/

Page 55: Angular 2 par Cyril Balit & Douglas Duteil

Merci ! @cbalit@douglasduteil