SlideShare a Scribd company logo
1 of 28
Download to read offline
Jakub Nietrzeba
Łagodne wprowadzenie do Angular2
GDG Rzeszów #1
8 Marca 2016
AngularJS
● Rozdzielenie kodu od drzewa DOM
● Projektowanie aplikacji wywrócone do góry
nogami (HTML first)
● Automatyczne wiązanie (binding) zmiennych
JavaScript z fragmentami strony
● Magia!
AngularJS
● Duże aplikacje po stronie klienta
● Skupione na pobieraniu i pokazywaniu danych
● Formularze, tabele, pola
● Rozdzielenie widoku od kodu serwera (API)
● Rozłączne wersjonowanie
AngularJS 1.x →2.x
● JavaScript → TypeScript
● Controller → Component
● Directive →Directive
● Filtr → Pipe
● Widoki i serwisy nadal tu są
● Property tak, attrybuty nie
● Trudniej dobrać się do drzewa DOM
● Shadow DOM!
● Beta, beta, beta, beta, beta, beta…
TypeScript
● Mocno typowany
– Typy pól, parametrów funkcji i wartości zwracanych
● Interfejsy
● Klasy
– Lista inicjalizacyjna konstruktora
● Wbudowana modularność
● Kompilowany (odcukrzany) do czystego JS
● Arrow function!
– (x) => { return Math.sin(x); }
Unboxing
● Zainstalować NodeJS
https://gist.github.com/isaacs/579814#file-node-and-npm-in-30-seconds-sh
● npm install -g npm
● npm install -g angular-cli
● ng init -n {nazwa aplikacji}
● ng serve
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
npm install --save zone.js
http://localhost:4200/
angular-cli (ng)
● Narzędzie rozwijane przez tych samych ludzi co
AngularJS
● Bootstraping aplikacji
● Generator – ng g
● Tester – ng test
● Niszczyciel – ng destroy
● Uruchamiacz – ng serve
● ng help to kilkaset linijek możliwości
ng g route {route}
● Zostanie utworzony katalog modułu (ścieżki)
– Detale pojedynczego elementu (html, css, ts)
– Lista elementów (html, css, ts)
– Komponent (definicja i ścieżki)
– Serwis na elementy
– Testy
http://localhost:4200/slide
http://localhost:4200/slide/1
slide-root.component.ts
import {Component} from 'angular2/core';
import {RouteConfig, RouterOutlet} from 'angular2/router';
import {SlideListComponent} from './slide-list.component';
import {SlideDetailComponent} from './slide-detail.component';
import {SlideService} from './slide.service';
@Component({
template: '<router-outlet></router-outlet>',
providers: [SlideService],
directives: [RouterOutlet]
})
slide-root.component.ts
@RouteConfig([
{path: '/', name: 'SlideList', component:
SlideListComponent, useAsDefault: true},
{path: '/:id', name: 'SlideDetail', component:
SlideDetailComponent}
])
export class SlideRoot {
constructor() {}
}
Co tu się dzieje?
● Importuje jakieś rzeczy z jądra
● Importuje komponent listy
● Importuje komponent detali (edycja/podgląd)
● Importuje serwis
● <router-outlet></router-outlet>
● Dekoratory, wszędzie dekoratory
– @Component
– @RouteConfig
● Pusta klasa komponentu?
slide-list.component.ts
import {Component, OnInit} from 'angular2/core';
import {Slide, SlideService} from './slide.service';
import {ROUTER_DIRECTIVES} from 'angular2/router';
@Component({
templateUrl: 'app/slide/slide-list.component.html',
styleUrls: ['app/slide/slide-list.component.css'],
directives: [ROUTER_DIRECTIVES]
})
export class SlideListComponent implements OnInit {
slides: Slide[]; // here is magic!
constructor(private _service: SlideService) {}
ngOnInit() { this._service.getAll().then(slides => this.slides = slides); }
}
Co tu się dzieje?
● Importy, importy, importy
– TypeScript nie posiada class loadera, trzeba
ręcznie
– Jest „odsładzany” (desugared) do JS
● @Component
– Szablon i styl jako linki
– Używa wszystkich dyrektyw routera
Co tu się dzieje?
● Eksportowana klasa componentu coś robi!
– OnInit – jeden ze zdarzeń cyklu życia komponentu
(OnDestory, OnChanges…)
– Domyślnie publiczna zmienna slides
– Sprytny konstruktor – lista inicjalizacyjna
konstruktora (C++ anyone?)
● No dobra, ale gdzie ta całą magia?
slide.service.ts
import {Injectable} from 'angular2/core';
export class Slide {
constructor(public id: number, public name: string) {}
}
@Injectable()
export class SlideService {
…
slide.service.ts
getAll() { return promise; }
get(id: number) { return promise.then(all => all.find(e =>
e.id === id)); }
}
let mock = [new Slide(1, 'one'), new Slide(2, 'two'), new
Slide(3, 'three')];
let promise = Promise.resolve(mock);
Co tu się dzieje?
● Dwie eksportowane klasy (Slide, SlideService)
– W prawdziwej aplikacji każda klasa we własnym
pliku
● Klasa serwisu odekorowana
– Gotowa do wstrzykiwania
● Mockupy dla testów
– W prawdziwej aplikacji zamiast mockupów byłyby
odwołania do API
slide-list.component.html
<h2>Slide List</h2>
<ul>
<li *ngFor="#slide of slides">
<a
[routerLink]="['SlideDetail', { id: slide.id }]">
<strong>{{slide.id}}</strong>
-
{{slide.name}}
</a>
</li>
</ul>
Co tu się dzieje?
● *ngFor
– Multiplikuje (trudne słowo!) fragment drzewa DOM
– Łączy fragmenty ze iterowaną zmienną
– Obserwuje zmiany tej zmiennej
● Binding! Binding?
– [ ] - property binding (z modelu do widoku)
– ( ) - action binding (z widoku do modelu/kontrolera)
– [( )] - w obie strony (formularze!)
Interpolacja
● {{ }}
● Interpretuje i obserwuje wyrażenie i podmienia w
DOM
– {{ 1 + 2 }} → 3
– {{ 1 + countValues() }} → 4
● Ograniczenie!
– Wyrażenie jest interpretowane w locie
– Niemożliwe: new ; = ++ -- += -= i inne…
– Pipe & Elvis (będzie później)
slide-detail.component.html
<div *ngIf="slide">
<h3>"{{editName}}"</h3>
<div>
<label>Id:</label>
{{slide.id}}
</div>
<div>
<label>Name:</label>
<input [(ngModel)]="editName" placeholder="name"/>
</div>
<button (click)="save()">Save</button>
<button (click)="cancel()">Cancel</button>
</div>
Co tu się dzieje?
● ngIf wyrzuci całą gałąź DOM gdy będzie false
● {{ editName }} wyświetli zmienną z komponentu
● {{ slide.id }} wyświetli zmienną z obiektu
● [(ngModel)]=”editName”
– Dyrektywa ngModel jest nakarmiona powiązaniem ze zmienną
editName z komponentu
– Wiązanie jest obustronne
● (click)=”save()”
– Property click (dyrektywa) jest powiązana z funkcją save z komponentu
– Wiązanie jednostronne
Pipe & Elvis
● Operator .? Wybacza
– {{ ala.?ma.?kota }} nie zawiedzie gdy kota nie ma
● Pipe
– {{ „Cośtam” | uppercase }} → COŚTAM
– Transformery nakładane są na dane przed wyświetleniem
– Transformery można łączyć w łańcuchy
– {{ createdAt | date:”Y-m-d” }} - parametry!
– ng g pipe {nazwa}
– Dekorator komponentu ma tablice na to
Sztuczki
● npm install -g typings
– typings search {name}
– Lodash i wiele innych bibliotek jest opisanych
● Bootstrap (wtop się w internetowy tłum)
– npm install bootstrap
– Dodaj do index.html (same style)
– Inne podejście pod:
https://github.com/valor-software/ng2-bootstrap
● ng github-pages:deploy
Źródła
● https://angular.io/docs/ts/latest/
● https://github.com/Microsoft/TypeScript/blob/m
aster/doc/spec.md
● https://www.npmjs.com/package/typings
● https://github.com/angular/angular-cli

More Related Content

Similar to Łagodne wprowadzenie do Angular2

Historia jednej migracji - Angular 5
Historia jednej migracji - Angular 5Historia jednej migracji - Angular 5
Historia jednej migracji - Angular 5Przemek Smyrdek
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymDariusz Jagieło
 
Angular js warsztaty stopień 2
Angular js   warsztaty stopień 2Angular js   warsztaty stopień 2
Angular js warsztaty stopień 2Marcin Wosinek
 
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014Grzegorz Bartman
 
Architektura aplikacji android
Architektura aplikacji androidArchitektura aplikacji android
Architektura aplikacji androidSages
 
Encje w drupalu - DrupalCamp Wroclaw 2015
Encje w drupalu - DrupalCamp Wroclaw 2015Encje w drupalu - DrupalCamp Wroclaw 2015
Encje w drupalu - DrupalCamp Wroclaw 2015Grzegorz Bartman
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Quick-Solution
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Domain Driven Development
Domain Driven DevelopmentDomain Driven Development
Domain Driven DevelopmentKonrad Russa
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaBartlomiej Zass
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPPiotr Gabryjeluk
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)Bartlomiej Zass
 
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...The Software House
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationMariusz Koprowski
 
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxAplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxDawid Rusnak
 
Co nowego w rails 3
Co nowego w rails 3Co nowego w rails 3
Co nowego w rails 3Piotr Macuk
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Droptica
 

Similar to Łagodne wprowadzenie do Angular2 (20)

Historia jednej migracji - Angular 5
Historia jednej migracji - Angular 5Historia jednej migracji - Angular 5
Historia jednej migracji - Angular 5
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastym
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Angular js warsztaty stopień 2
Angular js   warsztaty stopień 2Angular js   warsztaty stopień 2
Angular js warsztaty stopień 2
 
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
 
Architektura aplikacji android
Architektura aplikacji androidArchitektura aplikacji android
Architektura aplikacji android
 
Encje w drupalu - DrupalCamp Wroclaw 2015
Encje w drupalu - DrupalCamp Wroclaw 2015Encje w drupalu - DrupalCamp Wroclaw 2015
Encje w drupalu - DrupalCamp Wroclaw 2015
 
react-pl.pdf
react-pl.pdfreact-pl.pdf
react-pl.pdf
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Domain Driven Development
Domain Driven DevelopmentDomain Driven Development
Domain Driven Development
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założenia
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHP
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)
 
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
 
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxAplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/Redux
 
Co nowego w rails 3
Co nowego w rails 3Co nowego w rails 3
Co nowego w rails 3
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]
 

Łagodne wprowadzenie do Angular2

  • 1. Jakub Nietrzeba Łagodne wprowadzenie do Angular2 GDG Rzeszów #1 8 Marca 2016
  • 2. AngularJS ● Rozdzielenie kodu od drzewa DOM ● Projektowanie aplikacji wywrócone do góry nogami (HTML first) ● Automatyczne wiązanie (binding) zmiennych JavaScript z fragmentami strony ● Magia!
  • 3. AngularJS ● Duże aplikacje po stronie klienta ● Skupione na pobieraniu i pokazywaniu danych ● Formularze, tabele, pola ● Rozdzielenie widoku od kodu serwera (API) ● Rozłączne wersjonowanie
  • 4. AngularJS 1.x →2.x ● JavaScript → TypeScript ● Controller → Component ● Directive →Directive ● Filtr → Pipe ● Widoki i serwisy nadal tu są ● Property tak, attrybuty nie ● Trudniej dobrać się do drzewa DOM ● Shadow DOM! ● Beta, beta, beta, beta, beta, beta…
  • 5. TypeScript ● Mocno typowany – Typy pól, parametrów funkcji i wartości zwracanych ● Interfejsy ● Klasy – Lista inicjalizacyjna konstruktora ● Wbudowana modularność ● Kompilowany (odcukrzany) do czystego JS ● Arrow function! – (x) => { return Math.sin(x); }
  • 6. Unboxing ● Zainstalować NodeJS https://gist.github.com/isaacs/579814#file-node-and-npm-in-30-seconds-sh ● npm install -g npm ● npm install -g angular-cli ● ng init -n {nazwa aplikacji} ● ng serve echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p npm install --save zone.js
  • 8. angular-cli (ng) ● Narzędzie rozwijane przez tych samych ludzi co AngularJS ● Bootstraping aplikacji ● Generator – ng g ● Tester – ng test ● Niszczyciel – ng destroy ● Uruchamiacz – ng serve ● ng help to kilkaset linijek możliwości
  • 9. ng g route {route} ● Zostanie utworzony katalog modułu (ścieżki) – Detale pojedynczego elementu (html, css, ts) – Lista elementów (html, css, ts) – Komponent (definicja i ścieżki) – Serwis na elementy – Testy
  • 12. slide-root.component.ts import {Component} from 'angular2/core'; import {RouteConfig, RouterOutlet} from 'angular2/router'; import {SlideListComponent} from './slide-list.component'; import {SlideDetailComponent} from './slide-detail.component'; import {SlideService} from './slide.service'; @Component({ template: '<router-outlet></router-outlet>', providers: [SlideService], directives: [RouterOutlet] })
  • 13. slide-root.component.ts @RouteConfig([ {path: '/', name: 'SlideList', component: SlideListComponent, useAsDefault: true}, {path: '/:id', name: 'SlideDetail', component: SlideDetailComponent} ]) export class SlideRoot { constructor() {} }
  • 14. Co tu się dzieje? ● Importuje jakieś rzeczy z jądra ● Importuje komponent listy ● Importuje komponent detali (edycja/podgląd) ● Importuje serwis ● <router-outlet></router-outlet> ● Dekoratory, wszędzie dekoratory – @Component – @RouteConfig ● Pusta klasa komponentu?
  • 15. slide-list.component.ts import {Component, OnInit} from 'angular2/core'; import {Slide, SlideService} from './slide.service'; import {ROUTER_DIRECTIVES} from 'angular2/router'; @Component({ templateUrl: 'app/slide/slide-list.component.html', styleUrls: ['app/slide/slide-list.component.css'], directives: [ROUTER_DIRECTIVES] }) export class SlideListComponent implements OnInit { slides: Slide[]; // here is magic! constructor(private _service: SlideService) {} ngOnInit() { this._service.getAll().then(slides => this.slides = slides); } }
  • 16. Co tu się dzieje? ● Importy, importy, importy – TypeScript nie posiada class loadera, trzeba ręcznie – Jest „odsładzany” (desugared) do JS ● @Component – Szablon i styl jako linki – Używa wszystkich dyrektyw routera
  • 17. Co tu się dzieje? ● Eksportowana klasa componentu coś robi! – OnInit – jeden ze zdarzeń cyklu życia komponentu (OnDestory, OnChanges…) – Domyślnie publiczna zmienna slides – Sprytny konstruktor – lista inicjalizacyjna konstruktora (C++ anyone?) ● No dobra, ale gdzie ta całą magia?
  • 18. slide.service.ts import {Injectable} from 'angular2/core'; export class Slide { constructor(public id: number, public name: string) {} } @Injectable() export class SlideService { …
  • 19. slide.service.ts getAll() { return promise; } get(id: number) { return promise.then(all => all.find(e => e.id === id)); } } let mock = [new Slide(1, 'one'), new Slide(2, 'two'), new Slide(3, 'three')]; let promise = Promise.resolve(mock);
  • 20. Co tu się dzieje? ● Dwie eksportowane klasy (Slide, SlideService) – W prawdziwej aplikacji każda klasa we własnym pliku ● Klasa serwisu odekorowana – Gotowa do wstrzykiwania ● Mockupy dla testów – W prawdziwej aplikacji zamiast mockupów byłyby odwołania do API
  • 21. slide-list.component.html <h2>Slide List</h2> <ul> <li *ngFor="#slide of slides"> <a [routerLink]="['SlideDetail', { id: slide.id }]"> <strong>{{slide.id}}</strong> - {{slide.name}} </a> </li> </ul>
  • 22. Co tu się dzieje? ● *ngFor – Multiplikuje (trudne słowo!) fragment drzewa DOM – Łączy fragmenty ze iterowaną zmienną – Obserwuje zmiany tej zmiennej ● Binding! Binding? – [ ] - property binding (z modelu do widoku) – ( ) - action binding (z widoku do modelu/kontrolera) – [( )] - w obie strony (formularze!)
  • 23. Interpolacja ● {{ }} ● Interpretuje i obserwuje wyrażenie i podmienia w DOM – {{ 1 + 2 }} → 3 – {{ 1 + countValues() }} → 4 ● Ograniczenie! – Wyrażenie jest interpretowane w locie – Niemożliwe: new ; = ++ -- += -= i inne… – Pipe & Elvis (będzie później)
  • 24. slide-detail.component.html <div *ngIf="slide"> <h3>"{{editName}}"</h3> <div> <label>Id:</label> {{slide.id}} </div> <div> <label>Name:</label> <input [(ngModel)]="editName" placeholder="name"/> </div> <button (click)="save()">Save</button> <button (click)="cancel()">Cancel</button> </div>
  • 25. Co tu się dzieje? ● ngIf wyrzuci całą gałąź DOM gdy będzie false ● {{ editName }} wyświetli zmienną z komponentu ● {{ slide.id }} wyświetli zmienną z obiektu ● [(ngModel)]=”editName” – Dyrektywa ngModel jest nakarmiona powiązaniem ze zmienną editName z komponentu – Wiązanie jest obustronne ● (click)=”save()” – Property click (dyrektywa) jest powiązana z funkcją save z komponentu – Wiązanie jednostronne
  • 26. Pipe & Elvis ● Operator .? Wybacza – {{ ala.?ma.?kota }} nie zawiedzie gdy kota nie ma ● Pipe – {{ „Cośtam” | uppercase }} → COŚTAM – Transformery nakładane są na dane przed wyświetleniem – Transformery można łączyć w łańcuchy – {{ createdAt | date:”Y-m-d” }} - parametry! – ng g pipe {nazwa} – Dekorator komponentu ma tablice na to
  • 27. Sztuczki ● npm install -g typings – typings search {name} – Lodash i wiele innych bibliotek jest opisanych ● Bootstrap (wtop się w internetowy tłum) – npm install bootstrap – Dodaj do index.html (same style) – Inne podejście pod: https://github.com/valor-software/ng2-bootstrap ● ng github-pages:deploy
  • 28. Źródła ● https://angular.io/docs/ts/latest/ ● https://github.com/Microsoft/TypeScript/blob/m aster/doc/spec.md ● https://www.npmjs.com/package/typings ● https://github.com/angular/angular-cli