geildanke.com @fischaelameer
Erste Schritte mit
Angular 2
geildanke.com @fischaelameer
geildanke.com @fischaelameer
Components
Data-Binding
Template-Syntax
Services
Dependency Injection
Pipes
…
geildanke.com @fischaelameer
Quelle: https://twitter.com/esfand/status/703678692661338115
geildanke.com @fischaelameer
Quelle: https://www.w3counter.com/globalstats.php?year=2009&month=7
geildanke.com @fischaelameer
Quelle: https://www.w3counter.com/globalstats.php?year=2009&month=7
geildanke.com @fischaelameer
ES2015
JavaScript Modules
Web Components
(Shadow DOM, Templates)
geildanke.com @fischaelameer
Angular is a development
platform for building
mobile and desktop
web applications.
geildanke.com @fischaelameer
Platform-unabhängig
Browser
Web-Worker
Native Apps
Server-side Rendering
geildanke.com @fischaelameer
JavaScript
TypeScript
Dart
Sprachen-Unabhängig
geildanke.com @fischaelameer
ES5
ES2015
TypeScript
geildanke.com @fischaelameer
Paradigma-Unabhängigkeit
Testbarkeit
Performance
geildanke.com @fischaelameer
Angular apps are modular.
geildanke.com @fischaelameer
import { AppComponent } from './app.component';
app.component.ts:
@Component(...)
export class AppComponent { … }
app.another-component.ts:
geildanke.com @fischaelameer
A Component controls a
patch of screen real estate
that we could call a view.
geildanke.com @fischaelameer
Component
View
Metadata
geildanke.com @fischaelameer
Component
View
Metadata
import { Component } from '@angular/core';
@Component({
selector: 'enterjs-app',
template: '<h1>Hello EnterJS</h1>'
})
export class EnterjsAppComponent { … }
geildanke.com @fischaelameer
@Component({
selector: 'enterjs-app',
template: '<h1>Hello EnterJS</h1>'
})
export class EnterjsAppComponent { … }
Decorators
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
geildanke.com @fischaelameer
@Component({
selector: 'enterjs-app',
templateUrl: 'enterjs.component.html',
styleUrls: [ 'enterjs.component.css' ]
})
geildanke.com @fischaelameer
Parent Component Child Components
geildanke.com @fischaelameer
Component
View
Metadata
Component
View
Metadata
Component
View
Metadata
Component
View
Metadata
Component
View
Metadata
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
geildanke.com @fischaelameer
Data binding is a mechanism
for coordinating what users see
with application data values.
geildanke.com @fischaelameer
<p>{{ talk.title }}</p>
<p [textContent]="talk.title"></p>
Component
View
Metadata
geildanke.com @fischaelameer
<img [attr.src]="imageSource">
<p [class.hidden]="isHidden"></p>
<p [style.color]="currentColor"></p>
Property Bindings
geildanke.com @fischaelameer
Component
View
Metadata
Interpolation
Property BindingsEvent Bindings
geildanke.com @fischaelameer
<button (click)="onDelete()">Delete</button>
<talk-cmp (talkDeleted)="deleteTalk()"></talk-cpm>
Event Binding
geildanke.com @fischaelameer
Component
View
Metadata
Interpolation
Property Binding
Event Binding
@Output @Input
[(ngModel)]
geildanke.com @fischaelameer
<input [(ngModel)]="talk.name"/>
<p>{{ talk.name }}</p>
<input [ngModel]="talk.name" (ngModelChange)="talk.name = $event">
Two-Way Data-Binding
geildanke.com @fischaelameer
Templates display data
and consume user events
with the help of data binding.
geildanke.com @fischaelameer
ngStyle
ngClass
ngFor
ngIf
ngSwitch
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
geildanke.com @fischaelameer
<p [class.hidden]="isHidden">Hello?</p>
<p [ngClass]="{ active: isActive, hidden: isHidden }">Hello??</p>
<p [ngClass]="setClasses()">Hello???</p>
NgClass
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>
geildanke.com @fischaelameer
<h2 *ngIf="talks.length > 0"><Talks:</h2>
NgIf
<h2 [style.display]="hasTalks ? 'block' : 'none'">Talks:</h2>
geildanke.com @fischaelameer
<div [ngSwitch]="talksCount">
<h2 *ngSwitchWhen="0">No talks available.</h2>
<h2 *ngSwitchWhen="1">Talk:</h2>
<h2 *ngSwitchDefault>Talks:</h2>
</div>
NgSwitch
geildanke.com @fischaelameer
<input #talk placeholder="Add a talk">
<button (click)="addTalk(talk.value)">Add talk</button>
Template Reference Variables
geildanke.com @fischaelameer
A service is typically
a class with a narrow,
well-defined purpose.
geildanke.com @fischaelameer
export class TalkService {
private talks : String[] = [];
getTalks() { … }
setTalk( talk : String ) { … }
}
talk.service.ts:
geildanke.com @fischaelameer
Angular's dependency injection
system creates and delivers
dependent services "just-in-time".
geildanke.com @fischaelameer
EnterjsAppComponent
YetAnotherServiceAnotherServiceTalkService
Injector
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 ) {}
…
}
geildanke.com @fischaelameer
Root Injector
Injector InjectorInjector
Injector
Injector
Injector
Injector
geildanke.com @fischaelameer
import { Injectable } from 'angular2/core';
import { Http } from 'angular2/http';
@Injectable()
export class TalkService {
constructor( private http: Http ) {}
…
}
talk.service.ts:
geildanke.com @fischaelameer
Components
Data-Binding
Template-Syntax
Services
Dependency Injection
Pipes
…
geildanke.com @fischaelameer
Pipes transform displayed values
within a template.
geildanke.com @fischaelameer
<p>{{ 'Hello EnterJS' | uppercase }}</p>
<!--> 'HELLO ENTERJS' </!-->
<p>{{ 'Hello EnterJS' | lowercase }}</p>
<!--> 'hello enterjs' </!-->
UpperCasePipe, LowerCasePipe
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
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
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
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
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
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
geildanke.com @fischaelameer
!
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
geildanke.com @fischaelameer
Angular looks for changes
to data-bound values through
a change detection process that
runs after every JavaScript event.
geildanke.com @fischaelameer
Quelle: https://docs.google.com/presentation/d/1GII-DABSG5D7Yhik4Be5RvL6IXPt-Kg8lXFLnxkhKsU
geildanke.com @fischaelameer
An Angular form coordinates
a set of data-bound user controls,
tracks changes, validates input,
and presents errors.
geildanke.com @fischaelameer
Forms
Template-Driven Forms
Model-Driven Forms
geildanke.com @fischaelameer
Angular has the ability to bundle
component styles with components
enabling a more modular design
than regular stylesheets.
geildanke.com @fischaelameer
View Encapsulation
Native
Emulated
None
geildanke.com @fischaelameer
Unit-Tests
E2E-Tests
Http-Modul
Router-Modul
geildanke.com @fischaelameer
michaela.lehr@geildanke.com
https://geildanke.com/ng2comet
@fischaelameer

2016 First steps with Angular 2 – enterjs