Building Angular 2.0 applications with TypeScript

30
TypeScript Angular 2.0 Declarative Components Declarative Templates Modules and More

Transcript of Building Angular 2.0 applications with TypeScript

Page 1: Building Angular 2.0 applications with TypeScript

TypeScriptAngular2.0Declarative ComponentsDeclarative TemplatesModules and More

Page 2: Building Angular 2.0 applications with TypeScript

Bill WagnerC# MVPMicrosoft Regional DirectorC# ECMA Standardization Committee.NET Foundation Advisory CouncilAuthor, Trainer, Consultant

Page 3: Building Angular 2.0 applications with TypeScript

Why Angular?• Create SPA applications

quickly• Consistent Architecture• Community Support• Developer Resources Angul

ar

Data Binding

Testability

Resources

Directives

Productivity

Lots of Features

Page 4: Building Angular 2.0 applications with TypeScript

Why TypeScript?• More Productivity• Static Type Analysis• Language Tool Support• Manage Large Codebases

Better TypeScript

Productivity

Type Safety

Static Tooling

Transpiles to

JavaScript

Page 5: Building Angular 2.0 applications with TypeScript

Why Angular + TypeScript• Angular 2.0 built using

TypeScript• TypeScript => ECMAScript 6• ECMAScript 6 is latest

standard

• All Moving Targets• Expected (?) Q1 2016

The Futur

e

Angular 2.0

TypeScript 2.0

EcmaScript 6

Page 6: Building Angular 2.0 applications with TypeScript

Today’s MissionBuild an Angular Application in TypeScript

Highlight Language Advantages

Page 7: Building Angular 2.0 applications with TypeScript

Step 1: What Happened Before

Page 8: Building Angular 2.0 applications with TypeScript

Step 2: Create the application (TypeScript)import { bootstrap, Component } from 'angular2/angular2'; @Component({    selector: 'deadbase-app',    template: '<h1>This is loaded from TypeScript</h1>'})class DeadBaseAppComponent {} bootstrap(DeadBaseAppComponent);

Page 9: Building Angular 2.0 applications with TypeScript

Step 3: Create Index.html<!DOCTYPE html><html><head>    <meta charset="utf-8" />    <title>First TypeScript sample</title>    <script src="https://code.angularjs.org/tools/system.js"></script>    <script src="https://code.angularjs.org/tools/typescript.js"></script>    <script src="https://code.angularjs.org/2.0.0-alpha.44/angular2.dev.js"></script>    <script>      System.config({        transpiler: 'typescript',        typescriptOptions: { emitDecoratorMetadata: true }      });      System.import('./app/deadbase.ts');    </script></head><body>    <deadbase-app>Loading....</deadbase-app></body></html> 

Page 10: Building Angular 2.0 applications with TypeScript

Server Side BuildsCompile TypeScript as part of the build processInstall dependencies in the development environment

Page 11: Building Angular 2.0 applications with TypeScript

Deadbase EditorDisplay a showDateVenue

Page 12: Building Angular 2.0 applications with TypeScript

Step 4: One-way Data Binding@Component({    selector: 'deadbase-app',    template: '<h1>{{title}}</h1><h2>{{venue}} Details!</h2>'})class DeadBaseAppComponent {    public title = "Deadbase - Grateful Dead Concert Archive";    public venue = "Filmore West";} 

Page 13: Building Angular 2.0 applications with TypeScript

Step 5: Create ConcertSet Classclass ConcertSet {    date: Date;    venue: string;    set: number;} 

public concert: ConcertSet = {    date: new Date(1971, 7, 2),    venue: "Filmore West",    set: 2} 

Page 14: Building Angular 2.0 applications with TypeScript

Step 6: Update the template, include ``

@Component({    selector: 'deadbase-app',    template: `        <h1>{{title}}</h1>        <h2>{{concert.date.toDateString()}} -- {{concert.venue}} Details!</h2>        <div><label>date: </label>{{concert.date.toDateString()}}</div>        <div><label>venue: </label>{{concert.venue}}</div>        <div><label>set: </label>{{concert.set}}</div>    `}) 

Page 15: Building Angular 2.0 applications with TypeScript

Step 7: Edit, after some iterationsimport { bootstrap, Component, FORM_DIRECTIVES }  from 'angular2/angular2'; class ConcertSet {    date: string;    venue: string;    set: number;}

Page 16: Building Angular 2.0 applications with TypeScript

Step 7: Edit, after some iterations@Component({    selector: 'deadbase-app',    template: `        <h1>{{title}}</h1>        <h2>{{concert.date}} -- {{concert.venue}} Details!</h2>        <div><label>date: </label> <input [(ng-model)]="concert.date" type="date"></div>        <div><label>venue: </label> <input [(ng-model)]="concert.venue" placeholder="venue"></div>        <div><label>set: </label> <input [(ng-model)]="concert.set" type="number"></div>    `,    directives: [FORM_DIRECTIVES]})

Page 17: Building Angular 2.0 applications with TypeScript

Step 7: Edit, after some iterationsclass DeadBaseAppComponent {    public title = "Deadbase - Grateful Dead Concert Archive";    public concert: ConcertSet = {        date: "1971-07-02",        venue: "Filmore West",        set: 2    }}

Page 18: Building Angular 2.0 applications with TypeScript

Master / DetailThe Dead played lots of showsThis is a *really* small sampling

Page 19: Building Angular 2.0 applications with TypeScript

Step 8: Build a Listimport { bootstrap, Component, FORM_DIRECTIVES, NgFor } from 'angular2/angular2'; @Component({    selector: 'deadbase-app',    template: `        <h1>{{title}}</h1>        <h2>My Tape List</h2>        <ul class="concerts">            <li *ng-for="#concert of concerts">                <span class="badge">{{concert.date}}</span> {{concert.venue}} {{concert.set}}            </li>        </ul>        <h2>{{concert.date}} -- {{concert.venue}} Details!</h2>        <div><label>date: </label><input [(ng-model)]="concert.date" type="date"></div>        <div><label>venue: </label><input [(ng-model)]="concert.venue" placeholder="venue"></div>        <div><label>set: </label><input [(ng-model)]="concert.set" type="number"></div>    `,    directives: [FORM_DIRECTIVES, NgFor], 

Page 20: Building Angular 2.0 applications with TypeScript

Step 9: Styles in the Templatestyles: [`  .concerts {list-style-type: none; margin-left: 1em; padding: 0; width: 30em;}  .concerts li { cursor: pointer; position: relative; left: 0; transition: all 0.2s ease; }  .concerts li:hover {color: #369; background-color: #EEE; left: .2em;}  .concerts .badge {    font-size: small;     color: white;     padding: 0.1em 0.7em;     background-color: #369;     line-height: 1em;     position: relative;     left: -1px;     top: -1px;   }   .selected { background-color: #EEE; color: #369; }`] 

Page 21: Building Angular 2.0 applications with TypeScript

Build Edit in PlaceSelect, and Edit Current Concert

Page 22: Building Angular 2.0 applications with TypeScript

Step 6a: Build a Directive factory/// <reference path="../scripts/typings/angularjs/angular.d.ts" /> module LabelApplication {    class ContentEditable implements ng.IDirective {         static factory(): ng.IDirectiveFactory {            return () => new ContentEditable();        }    }     LabelEditor .editorModule .directive('contenteditable', ContentEditable.factory());}; 

Page 23: Building Angular 2.0 applications with TypeScript

Build Edit in PlaceBuilding Directives and factories

Page 24: Building Angular 2.0 applications with TypeScript

Step 10: Update List Item Template<li *ng-for="#concert of concerts"     (click)="onselect(concert)"    [ng-class] = "getSelectedClass(concert)">    <span class="badge">{{concert.date}}</span> {{concert.venue}}  {{concert.set}}</li>

Page 25: Building Angular 2.0 applications with TypeScript

Step 11: Implement Handlerspublic selectedConcert: ConcertSet; onselect(concert: ConcertSet) {    this.selectedConcert = concert;} getSelectedClass(concert: ConcertSet) {    return { selected: concert == this.selectedConcert };} 

Page 26: Building Angular 2.0 applications with TypeScript

Step 12: Implement Details View<div *ng-if="selectedConcert">  <h2>{{selectedConcert.date}} --  {{selectedConcert.venue}} Details!</h2>  <div><label>date: </label> <input [(ng-model)]="selectedConcert.date" type="date"> </div>  <div><label>venue: </label> <input [(ng-model)]="selectedConcert.venue" placeholder="venue"> </div>  <div><label>set: </label> <input [(ng-model)]="selectedConcert.set" type="number"> </div></div>

Page 27: Building Angular 2.0 applications with TypeScript

Keys to ProductivityReview and Discussion

Page 28: Building Angular 2.0 applications with TypeScript

Key TypeScript Features for Productivity• Compilation step: Find syntax and type system errors• Avoid “Stringly Typed APIs”• Intellisense• Scoped Modules• “Private” implementation details• Compatible with JavaScript idioms

Page 29: Building Angular 2.0 applications with TypeScript

TypeScript Resources• http://www.typescriptlang.org• http://www.typescriptlang.org/Handbook• https://github.com/Microsoft/TypeScript • https://

github.com/Microsoft/TypeScript/blob/master/doc/spec.md

• http://www.typescriptlang.org/Playground

Page 30: Building Angular 2.0 applications with TypeScript

Bill [email protected]@billwagnerhttp://thebillwagner.com

https://github.com/BillWagner/TypeScriptAngular2/

ArchitectureSoftware Engineering PracticesDeveloper Training and Mentoring