Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

dufeit Christoph Lindmaier [email protected] David Leitner [email protected]

Slide 3

Slide 3 text

Tooling

Slide 4

Slide 4 text

Entstehung von JS • 10 Tage • Brendan Eich • Standard durch ECMA • Laufzeitumgebung = Browser Mocha LiveScript

Slide 5

Slide 5 text

1. Generation • Libraries • Toolkits

Slide 6

Slide 6 text

2. Generation • Client-Side MVC • Applicaton Structure • Data Binding

Slide 7

Slide 7 text

3. Generation • Complete Client Side • Applicaton Development

Slide 8

Slide 8 text

Google Javascript Frameworks • Angular 2 in Beta • Geschrieben in Typescript

Slide 9

Slide 9 text

Features Angular 2 • Speed & Performance • Simple & Expressive • Cross Platorm • Routng • Dependency Injecton

Slide 10

Slide 10 text

AngularJS 1 -> Angular2 • Ziele mit AngularJs 1 nicht erreichbar  Neues Framework • Binding • Dependency Injecton • Modularität • Performance

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Typescript • Open Source • Transpilieren zu JavaScript • Source Maps • Typen • Module • Typ Inferenz • Klassen, Interfaces

Slide 13

Slide 13 text

NPM • Package Manager • CLI Commands • Buildtool

Slide 14

Slide 14 text

Setup Angular 2 • package.json • Angular 2 dependencies • Dev dependencies • tsconfg.json • Confg fle für Typescript

Slide 15

Slide 15 text

package.json Name und Version der Applikaton

Slide 16

Slide 16 text

Typescript transpilieren und Lite-Server starten package.json

Slide 17

Slide 17 text

Typescript Compiler einmal ausführen package.json

Slide 18

Slide 18 text

Typescript Compiler im Watch-Modus ausführen package.json

Slide 19

Slide 19 text

Angular 2 Version package.json

Slide 20

Slide 20 text

Universal dynamic module loader package.json

Slide 21

Slide 21 text

Diverse Bibliotheken die von Angular benötgt werden package.json

Slide 22

Slide 22 text

Dependencies die während der Entwicklung benötgt werden package.json

Slide 23

Slide 23 text

Zu EcmaScript 5 Standard JavaScript Code transipilieren tsconfg.json

Slide 24

Slide 24 text

Sourcemap ist Bindeglied zwischen JavaScript und TypeScript Code sehr hilfreich beim Debuggen tsconfg.json

Slide 25

Slide 25 text

Angular2

Slide 26

Slide 26 text

index.html bootstrapper.ts [METADATA] component.ts

Slide 27

Slide 27 text

Angular 2 QuickStart System.config({ packages: { app: { format: 'register', defaultExtension: 'js' } } }); System.import('app/bootstrapper') .then(null, console.error.bind(console)); Loading... Einstegspunkt für Angular Komponente index.html

Slide 28

Slide 28 text

index.html Angular 2 QuickStart System.config({ packages: { app: { format: 'register', defaultExtension: 'js' } } }); System.import('app/bootstrapper') .then(null, console.error.bind(console)); Loading... SystemJS Module Loader System.import('module to import') C#: using JAVA: import

Slide 29

Slide 29 text

index.html import {bootstrap} from 'angular2/platform/browser'; import {Main} from './lw.componente'; bootstrap(Main); Angular 2 QuickStart System.config({ packages: { app: { format: 'register', defaultExtension: 'js' } } }); System.import('app/bootstrapper') .then(null, console.error.bind(console)); Loading... bootstrapper.ts

Slide 30

Slide 30 text

import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] } Decorator Component component.ts

Slide 31

Slide 31 text

Html-Tag component.ts import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] }

Slide 32

Slide 32 text

import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] } component.ts

Slide 33

Slide 33 text

import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] } component.ts

Slide 34

Slide 34 text

component.ts Binding import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] }

Slide 35

Slide 35 text

component.ts ngFor Binding •ngIf •ngSwitch •ngClass import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] }

Slide 36

Slide 36 text

component.ts ngFor Binding import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersionen"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] }

Slide 37

Slide 37 text

component.ts Method Binding import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

` }) export class Main { public title = "LinuxVersions"; public addYear(){ var currentYear = this.getCurrentYear(); this.title = "LinuxVersion in " + currentYear; } private getCurrentYear() : number { return (new Date()).getFullYear(); } }

Slide 38

Slide 38 text

component.ts import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

` }) export class Main { public title = "LinuxVersions"; public addYear(){ var currentYear = this.getCurrentYear(); this.title = "LinuxVersion in " + currentYear; } private getCurrentYear() : number { return (new Date()).getFullYear(); } }

Slide 39

Slide 39 text

component.ts import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

` }) export class Main { public title = "LinuxVersionen"; public addYear(){ var currentYear = this.getCurrentYear(); this.title = "LinuxVersion in " + currentYear; } private getCurrentYear() : number { return (new Date()).getFullYear(); } } Two-Way Binding

Slide 40

Slide 40 text

component.ts import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

` }) export class Main { public title = "LinuxVersionen"; public addYear(){ var currentYear = this.getCurrentYear(); this.title = "LinuxVersion in " + currentYear; } private getCurrentYear() : number { return (new Date()).getFullYear(); } }

Slide 41

Slide 41 text

import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] } component.ts

Slide 42

Slide 42 text

import {Component} from 'angular2/core'; @Component({ selector: 'lw-app', template: `

{{title}}

  • {{version.name}} {{version.number}}
` }) export class Main { public title = "LinuxVersions"; public versions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] } component.ts Template: templateUrl: 'pathToTemplate.html'

Slide 43

Slide 43 text

index.html bootstrapper.ts component.ts

Slide 44

Slide 44 text

index.html bootstrapper.ts component.ts service.ts [DI]

Slide 45

Slide 45 text

service.ts import {Injectable} from 'angular2/core' import {LinuxVersion} from "./linuxVersion"; @Injectable() export class LinuxVersionService{ private linuxVersions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] getCurrentLinuxVersions() : Array{ //this would probably call a webservice return this.linuxVersions; } addLinuxVersion(name: string, version: string) : void { this.linuxVersions.push({ name: name, number: version }); } }

Slide 46

Slide 46 text

service.ts export interface LinuxVersion{ name: string; number: string; } import {Injectable} from 'angular2/core' import {LinuxVersion} from "./linuxVersion"; @Injectable() export class LinuxVersionService{ private linuxVersions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] getCurrentLinuxVersions() : Array{ //this would probably call a webservice return this.linuxVersions; } addLinuxVersion(name: string, version: string) : void { this.linuxVersions.push({ name: name, number: version }); } }

Slide 47

Slide 47 text

service.ts import {Injectable} from 'angular2/core' import {LinuxVersion} from "./linuxVersion"; @Injectable() export class LinuxVersionService{ private linuxVersions = [ { name: "Ubuntu", number: "1604"}, { name: "Linux Mint", number: "17.3"}, { name: "ElementaryOS", number: "0.3.2"}, { name: "Fedora", number: "23"} ] getCurrentLinuxVersions() : LinuxVersion[]{ //this would probably call a webservice return this.linuxVersions; } addLinuxVersion(name: string, version: string) : void { this.linuxVersions.push({ name: name, number: version }); } } = Singleton

Slide 48

Slide 48 text

Component.ts import {Component} from 'angular2/core'; import {LinuxVersionService} from "./LinuxVersionService"; import {LinuxVersion} from "./linuxVersion"; @Component({ selector: 'lw-app', template: `
  • {{version.name}} {{version.number}}
`, providers: [LinuxVersionService] }) export class Main { constructor(private _linuxVersionService: LinuxVersionService) { } get versions():Array { return this._linuxVersionService.getCurrentLinuxVersions(); } }

Slide 49

Slide 49 text

import {Component} from 'angular2/core'; import {LinuxVersionService} from "./LinuxVersionService"; import {LinuxVersion} from "./linuxVersion"; @Component({ selector: 'lw-app', template: `
  • {{version.name}} {{version.number}}
`, providers: [LinuxVersionService] }) export class Main { constructor(private _linuxVersionService: LinuxVersionService) { } get versions():Array { return this._linuxVersionService.getCurrentLinuxVersions(); } } Component.ts versions : Array; get version(): Array { return ... } set version(): Array { ... = value; }

Slide 50

Slide 50 text

index.html bootstrapper.ts component.ts service.ts [DI]

Slide 51

Slide 51 text

index.html detail.ts service.ts [DI] master.ts /Master / Detail[id] bootstrapper.ts main.ts

Slide 52

Slide 52 text

main.ts @Component({ selector: 'lw-app', template: ` `, directives: [ROUTER_DIRECTIVES], providers: [ROUTER_PROVIDERS] }) @RouteConfig([ { path: '/detail/:id', name: 'VersionDetail', component: VersionDetailComponent, }, { path: '/versions', name: 'Versions', component: VersionsComponent, useAsDefault: true } ]) export class Main { public title = "LinuxVersionen"; }

Slide 53

Slide 53 text

main.ts @Component({ selector: 'lw-app', template: ` `, directives: [ROUTER_DIRECTIVES], providers: [ROUTER_PROVIDERS] }) @RouteConfig([ { path: '/detail/:id', name: 'VersionDetail', component: VersionDetailComponent, }, { path: '/versions', name: 'Versions', component: VersionsComponent, useAsDefault: true } ]) export class Main { public title = "LinuxVersionen"; }

Slide 54

Slide 54 text

master.ts @Component({ selector: 'lw-versions', template: ` `, providers: [LinuxVersionService, ROUTER_PROVIDERS] }) export class VersionsComponent { constructor( private _router : Router, private _linuxVersionService: LinuxVersionService ) { } get versions():Array { return this._linuxVersionService.getCurrentLinuxVersions(); } getDetail(version: LinuxVersion) { this._router.navigate(['VersionDetail', { id: version.id }]); } }

Slide 55

Slide 55 text

detail.ts @Component({ selector: 'lw-version-detail', template: `
Name {{version.name}}
Number {{version.number}}
Id {{version.id}}
`, providers: [LinuxVersionService] }) export class VersionDetailComponent implements OnInit{ version : LinuxVersion; constructor(private _linuxVersionService: LinuxVersionService, private _routeParams: RouteParams) { } ngOnInit() { let id = +this._routeParams.get('id'); this.version = this._linuxVersionService.getLinuxVersion(id) } }

Slide 56

Slide 56 text

detail.ts @Component({ selector: 'lw-version-detail', template: `
Name {{version.name}}
Number {{version.number}}
Id {{version.id}}
`, providers: [LinuxVersionService] }) export class VersionDetailComponent implements OnInit{ version : LinuxVersion; constructor(private _linuxVersionService: LinuxVersionService, private _routeParams: RouteParams) { } ngOnInit() { let id = this._routeParams.get('id'); this.version = this._linuxVersionService.getLinuxVersion(id) } } Lifecycle Hooks: •ngOnInit •ngOnChanges •ngOnDestroy •ngAferViewInit •ngDoCheck •…

Slide 57

Slide 57 text

/Detail/0 /Versions index.html SinglePageApplicaton

Slide 58

Slide 58 text

index.html detail.ts service.ts [DI] master.ts /Master / Detail[id] bootstrapper.ts main.ts

Slide 59

Slide 59 text

index.html detail.ts service.ts [DI] master.ts /Master / Detail[id] bootstrapper.ts main.ts specs.ts Tests Test Runner

Slide 60

Slide 60 text

service.spec.ts import { LinuxVersionService } from '../app/linuxVersionService'; import {describe, it, beforeEach, expect} from 'angular2/testing'; describe('LinuxVersionService', () => { var linuxVersionService: LinuxVersionService = null; beforeEach(()=>{ linuxVersionService = new LinuxVersionService(); }); it('can add linuxVersion', () => { let expectedVersionCount = linuxVersionService.getCurrentLinuxVersions().length + 1; linuxVersionService.addLinuxVersion('Debian', '8.4 Jessie'); let actualVersionCount = linuxVersionService.getCurrentLinuxVersions().length; expect(actualVersionCount).toEqual(expectedVersionCount); }); it('can find linuxVersionById', () => { let addedVersionId = linuxVersionService.addLinuxVersion('Debian', '8.4 Jessie'); var linuxVersion = linuxVersionService.getLinuxVersion(addedVersionId); expect(linuxVersion.name).toEqual('Debian'); expect(linuxVersion.number).toEqual('8.4 Jessie'); }); });

Slide 61

Slide 61 text

import { LinuxVersionService } from '../app/linuxVersionService'; import {describe, it, beforeEach, expect} from 'angular2/testing'; describe('LinuxVersionService', () => { var linuxVersionService: LinuxVersionService = null; beforeEach(()=>{ linuxVersionService = new LinuxVersionService(); }); it('can add linuxVersion', () => { let expectedVersionCount = linuxVersionService.getCurrentLinuxVersions().length + 1; linuxVersionService.addLinuxVersion('Debian', '8.4 Jessie'); let actualVersionCount = linuxVersionService.getCurrentLinuxVersions().length; expect(actualVersionCount).toEqual(expectedVersionCount); }); it('can find linuxVersionById', () => { let addedVersionId = linuxVersionService.addLinuxVersion('Debian', '8.4 Jessie'); var linuxVersion = linuxVersionService.getLinuxVersion(addedVersionId); expect(linuxVersion.name).toEqual('Debian'); expect(linuxVersion.number).toEqual('8.4 Jessie'); }); }); service.spec.ts

Slide 62

Slide 62 text

import { LinuxVersionService } from '../app/linuxVersionService'; import {describe, it, beforeEach, expect} from 'angular2/testing'; describe('LinuxVersionService', () => { var linuxVersionService: LinuxVersionService = null; beforeEach(()=>{ linuxVersionService = new LinuxVersionService(); }); it('can add linuxVersion', () => { let expectedVersionCount = linuxVersionService.getCurrentLinuxVersions().length + 1; linuxVersionService.addLinuxVersion('Debian', '8.4 Jessie'); let actualVersionCount = linuxVersionService.getCurrentLinuxVersions().length; expect(actualVersionCount).toEqual(expectedVersionCount); }); it('can find linuxVersionById', () => { let addedVersionId = linuxVersionService.addLinuxVersion('Debian', '8.4 Jessie'); var linuxVersion = linuxVersionService.getLinuxVersion(addedVersionId); expect(linuxVersion.name).toEqual('Debian'); expect(linuxVersion.number).toEqual('8.4 Jessie'); }); }); service.spec.ts

Slide 63

Slide 63 text

testrunner.html Ng App Unit Tests ... System.config({ packages: { 'app': {defaultExtension: 'js'} } }); System.import('app/linuxVersionService.spec') .then(window.onload) .catch(console.error.bind(console));

Slide 64

Slide 64 text

index.html detail.ts service.ts [DI] master.ts /Master / Detail[id] bootstrapper.ts main.ts specs.ts Tests Test Runner

Slide 65

Slide 65 text

No content