Top Banner
Building Powerful Enterprise Apps
75

Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

Mar 18, 2018

Download

Technology

ITCamp
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

Building Powerful Enterprise Apps

Page 2: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

Microsoft Technical Evangelistblog: DavidGiard.comtv: TechnologyAndFriends.comtwitter: @DavidGiardEmail: [email protected]

David Giard

Page 3: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

Single Page Applications

Page 4: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Traditional Web App

HTML Page

Click me!

Server

Request

Response

Thank you, David!

Page 5: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Single Page App

HTML Page

Click me!

Server

Request

Response

Thank you, David!

{‘name’: ‘David’}

Page 6: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Angular

• SPA Framework• Open Source• Data Binding• Components• Modularize

Page 7: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

TypeScript

• Open Source• Superset of JavaScript• Transpiles to JavaScript

Page 8: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

TypeScript

foo.ts foo.js

Transpile

foo.map

Page 9: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Transpile

Page 10: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

TypeScript Transpiling – Command Linetsc

-p Compile a specific project or folder

-w Compile after each change detected

Page 11: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

TypeScript Transpiling – Continuous Delivery• Grunt, Gulp, Webpack, etc.• Visual Studio• VSTS

Page 12: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

TypeScript Advantages

• Productivity• Static Type Analysis• Language Tool Support• Better management of large codebases

Page 13: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Type Checking

var num1 = 5;var num2 = 10;…

num2=“10”;…

var sum = num1 + num2;

Page 14: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Type Checking

var num1: number = 5;var num2 : number = 10;…

num2=“10”;…

var sum: number = num1 + num2;

Page 15: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

tsconfig.json{"compilerOptions": {"target": "es5","module": "system","moduleResolution": "node","sourceMap": true,"emitDecoratorMetadata": true,"experimentalDecorators": true,"removeComments": false,"noImplicitAny": false

},"exclude": ["node_modules","typings/main","typings/main.d.ts"

]}

Page 16: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Angular

Page 17: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Key Parts of Angular

• Modules• Components• Templates• Directives• Services• Routing

Page 18: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Modules

Page 19: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Modules

• Built into Angular• Makes it easier to split code into smaller pieces• Import one module into another• Export module to make it available for import

Page 20: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Modules

import {Component} from 'angular2/core';@Component({

selector: 'my-selector',template: '<h1>Hello World</h1>'

})export class DemoComponent { }

Available outside this

module

Use exported moduleIn this

module

Page 21: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Components

Page 22: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Components

• Class (properties & methods)• Decorated with @Component• Template• Selector• Imported references

Page 23: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Templates and Selectors

Page 24: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Templates and Selectors

import {Component} from 'angular2/core';

@Component({selector: 'my-selector',template: '<h1>Hello World</h1>'

})export class DemoComponent { }

Page 25: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Selector@Component({

selector: 'my-selector',template: '<h1>Hello

World</h1>'})export class DemoComponent { }

<my-selector>Loading...</my-selector>

Page 26: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

<my-selector>Loading...</my-selector>

Templates@Component({

selector: 'my-selector',template: '<h1>Hello

World</h1>'})export class DemoComponent { }Output

Loading…

Page 27: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

<my-selector>Loading...</my-selector>

Templates@Component({

selector: 'my-selector',

template: '<h1>Hello World</h1>'

})

export class DemoComponent { }

Output

Hello World

Page 28: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

<my-selector>Loading...</my-selector>

Templates: Multi-Line

Output

Hello WorldWelcome

@Component({selector: 'my-selector',template: `

<h1>Hello World</h1><div>

Welcome!</div>`

})export class DemoComponent { }

Page 29: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

<my-selector>Loading...</my-selector>

Templates: External file@Component({

selector: 'my-selector',templateUrl: 'myPage.html'

})export class DemoComponent { }Output

<h1>Hello World</h1><div>

Welcome!</div>

myPage.html

Hello WorldWelcome

Page 30: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

<my-selector>Loading...</my-selector>

Components: Properties

Output

<h1>Hello World</h1><div>

Welcome {{customerName}}!</div>

myPage.html

Hello WorldWelcome David

@Component({selector: 'my-selector',templateUrl: 'myPage.html'

})export class DemoComponent {

customerName:string = “David”;}

Page 31: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Data Binding

• 1-Way Binding• Interpolation• 1-Way Property Binding

• 2-Way Property Binding• Event Binding

Page 32: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Interpolation

• Double curly braces around data• e.g.,

{{customerName}}

Page 33: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Interpolation

@Component({selector: 'my-selector',template: '<h1>Hello World</h1>'

})export class DemoComponent {

id=1;customerFirstName='David';customerLastName='Giard';

}

Page 34: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Interpolation

@Component({selector: 'my-selector',template: '<h1>Hello {{customerFirstName}}</h1>'

})export class DemoComponent {

id=1;customerFirstName='David';customerLastName='Giard';

}

1-Way Data Binding

Hello David

Page 35: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Interpolation@Component({

selector: 'my-selector',template: '<h1>Hello {{customer.FirstName}}</h1>'

})export class DemoComponent {

id=1;customer: Customer = {

FirstName='David';LastName='Giard';}

}export class Customer{

FirstName: string;LastName: string;

}

Page 36: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Interpolation@Component({

selector: 'my-selector',template: `

<h1>{{customer.FirstName}} Details</h1><div>First: {{customer.FirstName}}</div><div>Last: {{customer.LastName}}`})export class DemoComponent {

id=1;customer: Customer = {

FirstName='David';LastName='Giard';}

}

David DetailsFirst: DavidLast: Giard

Page 37: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

1-Way Data Binding

• Square brackets around property• []

Page 38: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

1-Way Data Binding

@Component({selector: 'my-selector',template: ‘<button [disabled]="dataNotChanged">Save</button>’

})export class DemoComponent {

dataNotChanged= true;}

Save

Page 39: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

1-Way Data Binding

@Component({selector: 'my-selector',template: ‘<button [disabled]=" dataNotChanged">Save</button>’

})export class DemoComponent {

dataNotChanged = true;}

Save

Page 40: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

1-Way Data Binding

@Component({selector: 'my-selector',template: ‘<button [disabled]=" dataNotChanged">Save</button>’

})export class DemoComponent {

dataNotChanged = false;}

Save

Page 41: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

2-Way Data Binding

• Requires FormsModule• [(property_to_bind)]

Page 42: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

2-Way Data Binding@Component({

selector: 'my-selector',template: `

<h1>{{customer.FirstName}} Details</h1><div>First: <input [(ngModel)]="customer.FirstName“ /> </div><div>Last: <input [(ngModel)]="customer.LastName“ /> </div>`})export class DemoComponent {

id=1;customer: Customer = {

FirstName='David';LastName='Giard';}

}

2-way data binding

David DetailsDavid

Giard

First:

Last:

1-way data binding

Page 43: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

2-Way Data Binding@Component({

selector: 'my-selector',template: `

<h1>{{customer.FirstName}} Details</h1><div>First: <input [(ngModel)]="customer.LastName“ /> </div><div>Last: <input [(ngModel)]="customer.FirstName“ /> </div>`})export class DemoComponent {

id=1;customer: Customer = {

FirstName='David';LastName='Giard';}

}D Details

D

Giard

First:

Last:

Page 44: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

2-Way Data Binding@Component({

selector: 'my-selector',template: `

<h1>{{customer.FirstName}} Details</h1><div>First: <input [(ngModel)]="customer.LastName“ /> </div><div>Last: <input [(ngModel)]="customer.FirstName" /> </div>`})export class DemoComponent {

id=1;customer: Customer = {

FirstName='David';LastName='Giard';}

}Da Details

Da

Giard

First:

Last:

Page 45: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

2-Way Data Binding@Component({

selector: 'my-selector',template: `

<h1>{{customer.FirstName}} Details</h1><div>First: <input [(ngModel)]="customer.LastName“ /> </div><div>Last: <input [(ngModel)]="customer.FirstName“ /> </div>`})export class DemoComponent {

id=1;customer: Customer = {

FirstName='David';LastName='Giard';}

}Dan Details

Dan

Giard

First:

Last:

Page 46: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

app.module.ts(required for ngModel)

@NgModule({imports: [FormsModule]

Page 47: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Events binding

<control (eventname)="methodname(parameters)">

click event<control (click)="methodtocall(parameters)">

e.g.,<div (click)="onClick(customer)">

Page 48: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

click@Component({

selector: 'my-selector',

template: `

<h1 (click)="onClick (customer)">{{customer.FirstName}} Details</h1>

<div>First: <input [(ngModel)]="customer.LastName" </div>

<div>Last: <input [(ngModel)]="customer.FirstName" </div>

`

})

export class DemoComponent {

id=1;

customer: Customer = {

FirstName='David';

LastName='Giard';

}

onClick(cust: Customer) { alert ("You Selected " + customer.FirstName); }

}

Page 49: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Bootstrapping your Angular app

Page 50: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

@NgModule({bootstrap: [AppComponent]

})export class AppModule {}

Bootstrapping

<script>…System.import(‘main.js')</script>

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

platformBrowserDynamic().bootstrapModule(AppModule);

main.ts / main.js= bootstrap file

Page 51: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Directives

Page 52: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Directives

• Allow you to attach behavior to DOM elements

Page 53: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Directives

• *ngFor• *ngIf• ngSwitch• ngClass• Custom Directives

Page 54: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

*ngfor

<div *ngFor="#cust of customers">{{cust.lastName}}, {{cust.firstName}}

</div>

var customers: Customer[] = [{ "id": 1, "firstName": " Satya", "lastName" : " Nadella" },{ "id": 2, "firstName": "Bill", "lastName": "Gates" },{ "id": 3, "firstName": "Steve", "lastName": "Ballmer" },{ "id": 4, "firstName": " David ", "lastName": " Giard " }];

Nadella, SatyaGates, BillBallmer, SteveGiard, David

Page 55: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

*ngIf

• Syntax: *ngif="condition"• Removes element from DOM if condition is not “truthy”

Page 56: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

*ngIf<h1>People I hate:</div><div *ngIf=“true”>

David Giard</div>

People I hate:David Giard

<h1>People I hate:</div><div *ngIf=“false”>

David Giard</div>

People I hate:

Page 57: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

*ngIf

<div><button (click)="clicked()">Toggle</button><div *ngIf="show">

Can you see me?</div>

</div>

export class DemoComponent {show: boolean = true;clicked() {this.show = !this.show; }

}

ToggleCan you see me?

Page 58: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

*ngIf

<div><button (click)="clicked()">Toggle</button><div *ngIf="show">

Can you see me?</div>

</div>

export class DemoComponent {show: boolean = true;clicked() {this.show = !this.show; }

}

ToggleCan you see me?

Page 59: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

LifeCycle Hooks

• OnInit• OnChanges• OnDestroy

Page 60: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

OnInit

export class foo implements OnInit {

...ngOnInit(){...}

}

Page 61: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Services

Page 62: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Services

• Class containing logic• Shared Code: Used by components or other services• Substitutable Objects• Dependency Injection

Page 63: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Servicesimport { Injectable } from '@angular/core';

@Injectable()export class CustService {getCustomers() {return customers;

}}

var customers: Customer[] = [{ "id": 1, "firstname": "David", "lastname": "Giard" },{ "id": 2, "firstname": "Bill", "lastname": "Gates" },{ "id": 3, "firstname": "Steve", "lastname": "Ballmer" },{ "id": 4, "firstname": "Satya", "lastname": "Nadella" }

];

CustomerService.ts

Page 64: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Servicesimport { Injectable } from '@angular/core';

@Injectable()export class CustService {getCustomers() {return customers;

}}…

CustomerService.ts

import { OnInit } from '@angular/core';import {CustService} from CustomerService

@Component({selector: 'xxx', template: 'yyy',…providers: [CustService]

})export class DemoComponent implements OnInit {

constructor(private customerService:CustService) { }

ngOnInit() {this.customers = this.customerService.getCustomers();

}}

Page 65: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Routing

Page 66: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Routing

• Load components dynamically into page• Link via URL• Client-side• Step 1: Bootstrap array of routes

Page 67: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Routinghttp://url.com/

HOME

---

---

---

---

Page 68: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Routinghttp://url.com/about

---

---

---

--- ABOUT

Page 69: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Routinghttp://url.com/products

---

---

---

--- PRODUCTS

Page 70: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Routingconst routes: Routes = [

{ path: foo', component: FooComponent

},{

path: ‘bar', component: BarComponent

},];

<a [routerLink]="[/foo']">Foo</a><a [routerLink]="[/bar']">Bar</a>

<router-outlet></router-outlet>

app.routes.ts

User clicks “Foo” link

Page 71: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

HTTP

import {Http } from '@angular/http';

...

this.http.get(webServiceUrl);

bootstrap(DemoComponent, [HTTP_PROVIDERS,

]);

main.ts

Component

Page 72: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Observables (via RxJs)

Observable<T>

Function

Subscribe

Data

Page 73: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

ObservablesgetCustomers(): Observable<customer[]> {

return Observable.create((observer: Observer<any>) => {

…observer.next(this.customers);

})}

this.episodeService. getCustomers().subscribe((data) => {

…}

Page 74: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

DEMO

Page 75: Building Powerful Applications with AngularJS 2 and TypeScript - David Giard

@DavidGiard

Links

• angular.io• typescriptlang.org• github.com/Microsoft/TypeScript• nodejs.org/en/download• code.visualstudio.com• tinyurl.com/angular2cheatsheet

• slideshare.net/dgiard/angular2-and-typescript• github.com/DavidGiard/dgtv• davidgiard.com