Seminario renuto all'IRES di Udine sulla migrazione, attraverso UpgradeModule, o la riscrittura di un'applicazione AngularJs in una applicazione Angular 2/4
7. COSA CAMBIA ORA
RISPETTO A PRIMA?
in collaborazione conconvertire o migrare
un’applicazione AngularJs
7
8. 1.Scrittura del codice
2.Design patterns
3.Nuove possibilità built-in
4.Leggerezza
in collaborazione conconvertire o migrare
un’applicazione AngularJs
8
13. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Component
Everything is a component!
Un componente rappresenta
l’entità più piccola all’interno di
una applicazione Angular.
Può essere impostato per
utilizzare Shadow DOM.
13
14. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Hierarchical
Dependency
Injection
Ogni servizio è iniettabile sia
all’interno di altri servizi, che in
componenti o direttive.
Il punto in cui viene iniettato,
tuttavia, è molto importante:
solamente i figli erediteranno la
dipendenza.
14
15. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Mixin
È possibile utilizzare degli
insiemi di classi per generare una
nuova classe.
15
16. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Model
Injection
È possibile utilizzare una classe
anche come blueprint per i
modelli di dati*.
* Oltre alle classi, è possibile utilizzare anche interface.
16
20. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Routing
ngRoute su AngularJs
rappresentava il sistema di
routing più semplice, seppur
adatto per molti casi. Per tutti gli
altri casi si ricorreva ad uiRouter.
RouterModule, invece, permette
fin da subito di avere una suite
completa per il routing in
Angular.
20
21. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Change
Detection
Strategy
In AngularJs, ogni volta che
veniva modificato lo stato
dell’applicazione, il Digest Cycle
verificava lo stato di ogni singolo
controller.
In Angular, questo meccanismo
molto pesante è stato
rimpiazzato da NgZone*.
*Angular change detection explained - Thoughtram
21
22. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Forms
FormsModule permette di creare
form in due modi diversi:
Template-Driven – definiti e
gestiti dalla view – o Reactive
Forms – definiti e gestiti dal
componente.
22
24. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Change
Detection
Strategy
Grazie ad NgZone, viene
renderizzato nuovamente solo il
componente il cui stato si
modifica.
Questo rende, ad esempio,
*ngFor nettamente più
performante di ng-repeat.
24
25. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Ahead
Of
Time
Un’applicazione Angular può
arrivare a pesare anche svariati
megabyte. Per rendere il tutto
più fruibile, soprattutto per
dispositivi mobile, è stata creata
una compilazione AOT, che
permette di compilare
progressivamente l’applicazione.
25
28. in collaborazione conconvertire o migrare
un’applicazione AngularJs
UpgradeModule permette di avviare
un’applicazione AngularJs all’interno
di un'applicazione Angular.
28
29. 1.Segui le style guide di AngularJs
I.One component per file
II.Modularity: folder-by-feature structure
2.Utilizza un module loader anche su AngularJs
3.Utilizza TypeScript anche su AngularJs
4.Utilizza possibilmente .directive e .component
I.Non utilizzare replace, compile, priority e terminal
in collaborazione conconvertire o migrare
un’applicazione AngularJs
29
35. in collaborazione conconvertire o migrare
un’applicazione AngularJs
npm install --save angular
35
Attenzione alla versione di AngularJs del tuo progetto!
36. in collaborazione conconvertire o migrare
un’applicazione AngularJs
36
/* src/ng-app/app.module.ts */
import * as angular from 'angular';
import { homeComponent } from './components/home/home.component';
import { ItemComponent } from './components/item/item.component';
angular.module('ng1App', [])
.component('ng1Home', homeComponent)
.component('ng1Item', ItemComponent);
37. in collaborazione conconvertire o migrare
un’applicazione AngularJs
37
/* src/ng-app/components/home/home.component.ts */
export let homeComponent = {
template: `<h1>{{ $ctrl.title }}</h1>`,
bindings: {
'title': '<'
}
};
38. in collaborazione conconvertire o migrare
un’applicazione AngularJs
38
/* src/ng-app/components/home/item.component.ts */
class ItemComponentController {
constructor() {
console.log('Hello!');
}
}
export let ItemComponent = {
template: `<p>Item component: {{ $ctrl.title }}</p>`,
bindings: {
'title': '<'
},
controller: ItemComponentController
};
43. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Downgrade
Strategy
Creare un componente Angular
per utilizzarlo all’interno di un
componente AngularJs
43
44. in collaborazione conconvertire o migrare
un’applicazione AngularJs
44
/* src/app/user/user.component.ts */
import { Component, EventEmitter, Input, Output } from '@angular/core';
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.scss']
})
export class UserComponent {
@Input() username: string;
@Output() fromOutside: EventEmitter<string> = new EventEmitter;
constructor() { }
onClick() {
this.fromOutside.emit(`Hello from the outside ${this.username}!`);
}
}
45. in collaborazione conconvertire o migrare
un’applicazione AngularJs
45
/* src/app/user/user.component.ts */
...
import { UserComponent } from './user/user.component';
@NgModule({
declarations: [
...
UserComponent
],
imports: [...],
entryComponents: [UserComponent]
})
export class AppModule { ... }
46. in collaborazione conconvertire o migrare
un’applicazione AngularJs
46
/* src/app/ng-app/app.module.ts */
...
import { downgradeComponent } from '@angular/upgrade/static';
import { UserComponent } from '../user/user.component';
angular.module('ng1App', [])
.directive('user', downgradeComponent({component: UserComponent}) as
angular.IDirectiveFactory);
48. in collaborazione conconvertire o migrare
un’applicazione AngularJs
Upgrade
Strategy
Creare un componente
AngularJs per utilizzarlo
all’interno di un componente
Angular
48
49. in collaborazione conconvertire o migrare
un’applicazione AngularJs
49
/* src/app/ng-app/components/item/upgraded.component.ts */
class UpgradedComponentController {
constructor() {}
}
export let UpgradedComponent = {
template: `<h3>This come from an upgraded component</h3>`,
controller: UpgradedComponentController
};
50. in collaborazione conconvertire o migrare
un’applicazione AngularJs
50
/* src/app/ng-app/app.module.ts */
...
import { UpgradedComponent } from './components/item/
upgraded.component';
angular.module('ng1App', [])
.component('ng1Upgraded', UpgradedComponent);
51. in collaborazione conconvertire o migrare
un’applicazione AngularJs
51
/* src/app/item/item.directive.ts */
import { Directive, ElementRef, Injector } from '@angular/core';
import { UpgradeComponent } from '@angular/upgrade/static';
@Directive({
selector: 'app-item'
})
export class ItemDirective extends UpgradeComponent {
constructor(elementRef: ElementRef, injector: Injector) {
super('ng1Upgraded', elementRef, injector);
}
}
52. in collaborazione conconvertire o migrare
un’applicazione AngularJs
52
/* src/app/app.module.ts */
...
import { ItemDirective } from './item/item.directive';
@NgModule({
declarations: [
...
ItemDirective
],
imports: [...],
entryComponents: [...]
})
export class AppModule { ... }
53. in collaborazione conconvertire o migrare
un’applicazione AngularJs
53
/* src/app/user/user.component.html */
...
<app-item></app-item>