2016 First steps with Angular 2 – enterjs

64
geildanke.com @fischaelameer Erste Schritte mit Angular 2

Transcript of 2016 First steps with Angular 2 – enterjs

Page 1: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Erste Schritte mit Angular 2

Page 2: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Page 3: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Components Data-Binding

Template-Syntax Services

Dependency Injection Pipes

Page 4: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Quelle: https://twitter.com/esfand/status/703678692661338115

Page 5: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Quelle: https://www.w3counter.com/globalstats.php?year=2009&month=7

Page 6: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Quelle: https://www.w3counter.com/globalstats.php?year=2009&month=7

Page 7: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

ES2015 JavaScript Modules Web Components

(Shadow DOM, Templates)

Page 8: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Angular is a development platform for building mobile and desktop

web applications.

Page 9: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Platform-unabhängig

Browser Web-Worker Native Apps

Server-side Rendering

Page 10: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

JavaScript TypeScript

Dart

Sprachen-Unabhängig

Page 11: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

ES5

ES2015

TypeScript

Page 12: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Paradigma-Unabhängigkeit Testbarkeit

Performance

Page 13: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Angular apps are modular.

Page 14: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

import { AppComponent } from './app.component';

app.component.ts:

@Component(...)export class AppComponent { … }

app.another-component.ts:

Page 15: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

A Component controls a patch of screen real estate that we could call a view.

Page 16: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Component

View

Metadata

Page 17: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Component

View

Metadata

import { Component } from '@angular/core';

@Component({ selector: 'enterjs-app', template: '<h1>Hello EnterJS</h1>'})

export class EnterjsAppComponent { … }

Page 18: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

@Component({ selector: 'enterjs-app', template: '<h1>Hello EnterJS</h1>'})

export class EnterjsAppComponent { … }

Decorators

Page 19: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

@Component({ selector: 'enterjs-app', template: '<h1>Hello EnterJS</h1>'})

export class EnterjsAppComponent {…

}

var EnterjsAppComponent = ng.core .Component({ selector: 'enterjs-app', template: '<h1>Hello EnterJS</h1>' }) .Class({ constructor: function () { … } });

TypeScript ES5

Page 20: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

@Component({ selector: 'enterjs-app', templateUrl: 'enterjs.component.html', styleUrls: [ 'enterjs.component.css' ]})

Page 21: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Parent Component Child Components

Page 22: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Component

View

Metadata

Component

View

Metadata

Component

View

Metadata

Component

View

Metadata

Component

View

Metadata

Page 23: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

import { Component } from 'angular2/core';

@Component({ selector: 'talk-cmp', templateUrl: './talk.component.html'})

export class TalkComponent { … }

import { Component } from '@angular/core';import { TalkComponent } from './talk.component';

@Component({ selector: 'enterjs-app', template: '<talk-cmp></talk-cmp>', directives: [ TalkComponent ]})

export class EnterjsAppComponent { … }

Parent

Child

Page 24: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Data binding is a mechanism for coordinating what users see

with application data values.

Page 25: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p>{{ talk.title }}</p><p [textContent]="talk.title"></p>

Component

View

Metadata

Page 26: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<img [attr.src]="imageSource">

<p [class.hidden]="isHidden"></p>

<p [style.color]="currentColor"></p>

Property Bindings

Page 27: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Component

View

Metadata Interpolation Property BindingsEvent Bindings

Page 28: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<button (click)="onDelete()">Delete</button>

<talk-cmp (talkDeleted)="deleteTalk()"></talk-cpm>

Event Binding

Page 29: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Component

View

Metadata Interpolation Property Binding

Event Binding

@Output @Input

[(ngModel)]

Page 30: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<input [(ngModel)]="talk.name"/><p>{{ talk.name }}</p>

<input [ngModel]="talk.name" (ngModelChange)="talk.name = $event">

Two-Way Data-Binding

Page 31: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Templates display data and consume user events

with the help of data binding.

Page 32: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

ngStyle ngClass

ngFor ngIf

ngSwitch

Page 33: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p [style.color]="currentColor">Hello!</p>

<p [ngStyle]="{ fontWeight: 900, color: currentColor }">Big Hello!</p>

<p [ngStyle]="setStyles()">Bigger Hello!</p>

NgStyle

Page 34: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p [class.hidden]="isHidden">Hello?</p>

<p [ngClass]="{ active: isActive, hidden: isHidden }">Hello??</p>

<p [ngClass]="setClasses()">Hello???</p>

NgClass

Page 35: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p *ngFor="let talk of talks">{{ talk.name }}</p>

<talk-cmp *ngFor="let talk of talks"></talk-cmp>

NgFor

<talk-cmp *ngFor="let talk of talks; let i=index" (talkDeleted)="deleteTalk(talk, i)"></talk-cmp>

Page 36: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<h2 *ngIf="talks.length > 0"><Talks:</h2>

NgIf

<h2 [style.display]="hasTalks ? 'block' : 'none'">Talks:</h2>

Page 37: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<div [ngSwitch]="talksCount"> <h2 *ngSwitchWhen="0">No talks available.</h2> <h2 *ngSwitchWhen="1">Talk:</h2> <h2 *ngSwitchDefault>Talks:</h2></div>

NgSwitch

Page 38: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<input #talk placeholder="Add a talk"><button (click)="addTalk(talk.value)">Add talk</button>

Template Reference Variables

Page 39: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

A service is typically a class with a narrow, well-defined purpose.

Page 40: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

export class TalkService {

private talks : String[] = [];

getTalks() { … } setTalk( talk : String ) { … }

}

talk.service.ts:

Page 41: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Angular's dependency injection system creates and delivers

dependent services "just-in-time".

Page 42: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

EnterjsAppComponent

YetAnotherServiceAnotherServiceTalkService

Injector

Page 43: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

import { Component } from '@angular/core';import { TalkService } from './bookmark.service';

@Component({ selector: 'enterjs-app', templateUrl: 'enterjs.component.html', providers: [ TalkService ]})

export class EnterjsAppComponent {

constructor( private talkService : TalkService ) {}

}

Page 44: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Root Injector

Injector InjectorInjector

Injector

Injector

Injector

Injector

Page 45: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

import { Injectable } from 'angular2/core';import { Http } from 'angular2/http';

@Injectable()

export class TalkService {

constructor( private http: Http ) {}

}

talk.service.ts:

Page 46: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Components Data-Binding

Template-Syntax Services

Dependency Injection Pipes

Page 47: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Pipes transform displayed values within a template.

Page 48: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p>{{ 'Hello EnterJS' | uppercase }}</p><!--> 'HELLO ENTERJS' </!-->

<p>{{ 'Hello EnterJS' | lowercase }}</p><!--> 'hello enterjs' </!-->

UpperCasePipe, LowerCasePipe

Page 49: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p>{{ talkDate | date:'ddMMyyyy' }}</p><!--> '15.06.2016' </!-->

<p>{{ talkDate | date:'longDate' }}</p><!--> '15. Juni 2016' </!-->

<p>{{ talkDate | date:'HHmm' }}</p><!--> '12:30' </!-->

<p>{{ talkDate | date:'shortTime' }}</p><!--> '12:30 Uhr' </!-->

DatePipe

Page 50: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p>{{ talkDate | date:'ddMMyyyy' }}</p><p>{{ talkDate | date:'dd-MM-yyyy' }}</p><p>{{ talkDate | date:'MM-dd-yyyy' }}</p>

<p>15.06.2016</p>

de-de

<p>06/15/2016</p>

en-us

Page 51: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p>{{ 11.38 | currency:'EUR' }}</p><!--> 'EUR11.38' </!-->

<p>{{ 11.38 | currency:'USD' }}</p><!--> '$11.38' </!-->

<p>{{ 0.11 | percent }}</p><!--> '11%' </!-->

<p>{{ 0.38 | percent:'.2' }}</p><!--> '38.00%' </!-->

CurrencyPipe, PercentPipe

Page 52: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p>{{ 'EnterJS' | slice:0:5 }}</p><!--> 'Enter' </!-->

<p>{{ talks | slice:0:1 | json }}</p><!--> [ { "name": "TalkName1" } ] </!-->

<p>{{ 1138 | number }}</p><!--> '1.138' </!-->

<p>{{ 1138 | number:'.2' }}</p><!--> '1.138.00' </!-->

NumberPipe, SlicePipe

Page 53: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

<p>{{ talks }}</p><!--> [object Object] </!-->

<p>{{ talks | json }}</p><!--> [ { "name": "TalkName1" },{ "name": "TalkName2" } ] </!-->

<p>{{ talks | slice:0:1 | json }}</p><!--> [ { "name": "TalkName1" } ] </!-->

JsonPipe

Page 54: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

import { Component } from 'angular2/core';

@Component({ selector: 'talk-cmp', template: '<p>{{ asyncTalk | async }}</p>'})

export class TalkComponent { asyncTalk: Promise<string> = new Promise( resolve => { window.setTimeout( () => resolve( 'No Talks' ), 1000 ); });}

AsyncPipe

Page 55: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

!

Page 56: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

import { PipeTransform, Pipe } from 'angular2/core';

@Pipe({name: 'ellipsis'})

export class EllipsisPipe implements PipeTransform {

transform( value ) { return value.substring( 0, 10 ) + '…'; }}

CustomPipe

Page 57: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Angular looks for changes to data-bound values through

a change detection process that runs after every JavaScript event.

Page 58: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Quelle: https://docs.google.com/presentation/d/1GII-DABSG5D7Yhik4Be5RvL6IXPt-Kg8lXFLnxkhKsU

Page 59: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

An Angular form coordinates a set of data-bound user controls,

tracks changes, validates input, and presents errors.

Page 60: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Forms

Template-Driven Forms Model-Driven Forms

Page 61: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Angular has the ability to bundle component styles with components

enabling a more modular design than regular stylesheets.

Page 62: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

View Encapsulation

Native Emulated

None

Page 63: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

Unit-Tests E2E-Tests

Http-Modul Router-Modul

Page 64: 2016 First steps with Angular 2 – enterjs

geildanke.com @fischaelameer

[email protected]

https://geildanke.com/ng2comet

@fischaelameer