SlideShare a Scribd company logo
Angular 2 for Java
Developers
Yakov Fain, Farata Systems
March 10, 2016
Angular 2
• Complete re-write of AngularJS
• Component-based
• Better performance
• No controllers, scopes
• Streamlined Dependency Injection
• Integrated RxJS
• Can write apps in TypeScript, 

Dart, or JavaScript (ES5 or ES6)
An app is a tree of components
HTML
A TypeScript class
HTML
Importing
modules
Class annotations
Project Structure
Config files
App dependencies
App code
{
Project Structure
SystemJS
transpiles
TS and
loads JS
bootstrap(ApplicationComponent)
Project Structure
bootstrap(ApplicationComponent)
Navigation with Router
import {Component} from 'angular2/core';

import {Product, ProductService} from 'app/services/product-service';
import CarouselComponent from '../carousel/carousel';

import ProductItemComponent from '../product-item/product-item';

import {ProductService} from '../../services/product-service';



@Component({

selector: 'auction-home-page',

directives: [

CarouselComponent,

ProductItemComponent

],

styleUrls: ['app/components/home/home.css'],

template: `

<div class="row carousel-holder">

<div class="col-md-12">

<auction-carousel></auction-carousel>

</div>

</div>

<div class="row">

<div *ngFor="#product of products" class="col-sm-4 col-lg-4 col
<auction-product-item [product]="product"></auction-product-i
</div>

</div>

`

})

export default class HomeComponent {

products: Product[] = [];



constructor(private productService: ProductService) {

this.products = this.productService.getProducts();

}

}

Exporing a

module
HomeComponent
Importing

Modules
Dependency
Injection
HomeComponent
import {Component} from 'angular2/core';

import {Product, ProductService} from 'app/services/product-service';
import CarouselComponent from '../carousel/carousel';

import ProductItemComponent from '../product-item/product-item';

import {ProductService} from '../../services/product-service';



@Component({

selector: 'auction-home-page',

directives: [

CarouselComponent,

ProductItemComponent

],

styleUrls: ['app/components/home/home.css'],

template: `

<div class="row carousel-holder">

<div class="col-md-12">

<auction-carousel></auction-carousel>

</div>

</div>

<div class="row">

<div *ngFor="#product of products" class="col-sm-4 col-lg-4 col
<auction-product-item [product]="product"></auction-product-i
</div>

</div>

`

})

export default class HomeComponent {

products: Product[] = [];



constructor(private productService: ProductService) {

this.products = this.productService.getProducts();

}

}

import {Component} from 'angular2/core';

import {Product, ProductService} from 'app/services/product-service';
import CarouselComponent from '../carousel/carousel';

import ProductItemComponent from '../product-item/product-item';

import {ProductService} from '../../services/product-service';



@Component({

selector: 'auction-home-page',

directives: [

CarouselComponent,

ProductItemComponent

],

styleUrls: ['app/components/home/home.css'],

template: `

<div class="row carousel-holder">

<div class="col-md-12">

<auction-carousel></auction-carousel>

</div>

</div>

<div class="row">

<div *ngFor="#product of products" class="col-sm-4 col-lg-4 col
<auction-product-item [product]="product"></auction-product-i
</div>

</div>

`

})

export default class HomeComponent {

products: Product[] = [];



constructor(private productService: ProductService) {

this.products = this.productService.getProducts();

}

}

Looping with *ngFor
A Sample Toolbox
Intro to TypeScript
http://www.typescriptlang.org
What’s TypeScript?
• An open-source language developed by Microsoft
• Designed by Anders Hejlsberg, the creator of C#, Delphi,
and Turbo Pascal
• A superset of JavaScript
• Well supported by IDEs
Benefits of Writing in TypeScript
• Increases your productivity in producing JavaScript
• Supports types, classes, interfaces, generics, annotations
• Compiles into a human-readable JavaScript
• Easy to learn by Java developers
• Supports most of the ES6 and some ES7 syntax
Transpiling TypeScript Interactively

http://www.typescriptlang.org/Playground
TypeScript JavaScript (E5)
Classes
TypeScript JavaScript (E5)
A Class With Constructor
TypeScript JavaScript (E5)
Inheritance
Classical syntax Prototypal
Generics
Error
No Errors
Arrow Function Expressions (lambdas)
var getName = () => 'John Smith';
console.log(`The name is ` + getName());
Interfaces as Custom Types
Interfaces and implements
TypeScript Compiler: tsc
• Install the typescript compiler with npm (comes with Node.js):



npm install -g typescript
• Compile main.ts into main.js specifying target language syntax:



tsc —t ES5 main.ts
• Usually the compiler’s options are set in tsconfig.json file
• The watch mode allows to auto-compile as files change:



tsc -w *.ts
import {bootstrap} from 'angular2/platform/browser';
import {Component} from 'angular2/core';
@Component({
selector: 'hello-world',
template: '<h1>Hello {{ name }}!</h1>'
})
class HelloWorldComponent {
name: string;
constructor() {
this.name = ‘World!';
}
}
bootstrap(HelloWorldComponent);
HelloWorldComponent in Angular
In HTML:



<hello-world></hello-world>
SystemJS: a Universal Module Loader
• ES6 defines modules, but not the loader
• ES7 should include the System object for loading
modules
• SystemJS is a polyfill that loads modules
Index.html Take 1
<!DOCTYPE html>
<html>
<head>
<script src="//npmcdn.com/angular2@2.0.0-beta.7/bundles/angular2-polyfills.js"></script>
<script src="//npmcdn.com/typescript@1.7.5/lib/typescript.js"></script>
<script src="//npmcdn.com/systemjs@0.19.22/dist/system.src.js"></script>
<script src="//npmcdn.com/rxjs@5.0.0-beta.2/bundles/Rx.js"></script>
<script src="//npmcdn.com/angular2@2.0.0-beta.7/bundles/angular2.dev.js"></script>


<script>
System.config({
transpiler: 'typescript',
typescriptOptions: {emitDecoratorMetadata: true}
});
System.import('main.ts');
</script>
</head>
<body>
<hello-world></hello-world>
</body>
</html>
Angular from CDN
SystemJS
HelloWorldComponent
Starting a new project with npm
1. Generate package.json for your project:

npm init -y
2. Add Angular dependencies to package.json
3. Download dependencies into the dir node_modules: 

npm install
4. Install live-server

npm install live-server -g
package.json
{
"name": "walkthrough5",
"version": "1.0.0",
"description": “A sample package.json for the Angular app”,
"scripts": {
"start": "live-server"
},
"dependencies": {
"es6-shim": "0.33.13",
"es6-promise": "^3.0.2",
"reflect-metadata": "0.1.2",
"rxjs": "5.0.0-beta.2",
"systemjs": "0.19.23",
"zone.js": "0.5.15",
"angular2": "2.0.0-beta.9"
},


"devDependencies": {
"live-server": "^0.9.0",
"typescript": "^1.7.5"
}
}
<!DOCTYPE html>
<html>
<head>
<script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="node_modules/typescript/lib/typescript.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="node_modules/rxjs/bundles/Rx.js"></script>
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
<script>
System.config({
transpiler: 'typescript',
typescriptOptions: {emitDecoratorMetadata: true}
});
System.import('main.ts');
</script>
</head>
<body>
<hello-world></hello-world>
</body>
</html>
Index.html Take 2
Angular’s local (after npm install)
Templates
• A place to write HTML
• Rendering is separated from the core framework
• Angular team works with Telerik on rendering for iOS and Android using NativeScript
@Component({

selector: 'auction-home-page',

…

styleUrls: ['app/components/home/home.css'],

template: `

<div class="row carousel-holder">

<div class="col-md-12">

<auction-carousel></auction-carousel>

</div>

</div>

<div class="row">

<div class="col-md-12">

<div class="form-group">

<input placeholder="Filter products by title” type="text">

</div>

</div>

</div>

`

})
Unidirectional Binding
From code to template:
<h1>Hello {{ name }}!</h1>
<span [hidden]=“isZipcodeValid”>Zip code is not valid</span>
From template to code:
<button (click)="placeBid()">Place Bid</button>
<input placeholder= "Product name" (input)="onInputEvent()">
Two-way Binding
Synchronizing Model and View:
<input [value]="myComponentProperty" 

(input)=“onInputEvent($event)>
<input [(ngModel)] = "myComponentProperty">
Dependency Injection
• Angular can create services; no need to use the new
operator
• Angular injects objects into components via constructors only
• Each component has an injector
• Providers specify how to inject
• If a component has no provider defined, Angular checks its
parent
product-service.ts
export class Product {

constructor(

public id: number,

public title: string,

public price: number,

public description: string) {

}

}



export class ProductService {

getProduct(): Product {

return new Product( 0, "iPhone 7", 249.99,
"The latest iPhone, 7-inch screen");

}

}
Injecting ProductService
import {Component, bind} from 'angular2/core';

import {ProductService, Product} from "../services/product-service";



@Component({

selector: 'di-product-page',

template: `<div>

<h1>Product Details</h1>

<h2>Title: {{product.title}}</h2>

<h2>Description: {{product.description}}</h2>

<h2>Price: ${{product.price}}</h2>

</div>`,

providers:[ProductService]

})



export default class ProductComponent {

product: Product;



constructor( productService: ProductService) {



this.product = productService.getProduct();

}

}

A provider can be a
class, factory, or a value
Injection
Injecting Dependencies of Dependencies
Injecting Dependencies of Dependencies
import {Http} from 'angular2/http';
@Injectable
export class ProductService {
constructor(private http:Http){
let products = http.get('products.json');
}
…
}
Routing Bulding Blocks
• RouterOutlet (<router-outlet>) - where the router should render the component
• @RouteConfig - map URLs to components to be rendered inside the <router-outlet>
• RouterLink ([routerLink]) - a link to a named route.
• RouteParams - a map of key-value pairs to pass parameters to the route
• RouteData - a map of key-value pairs used to pass additional data from
@RouteConfig to a route
@Component({

selector: ‘basic-routing',


template: `<a [routerLink]="['/Home']">Home</a>

<a [routerLink]="['/ProductDetail']">Product Details</a>

<router-outlet></router-outlet>`,

directives: [ ROUTER_DIRECTIVES]

})



@RouteConfig([

{path: '/', component: HomeComponent, as: 'Home'},

{path: '/product', component: ProductDetailComponent, as: 'ProductDetail'}

])

class RootComponent{

}



bootstrap(RootComponent, [ROUTER_PROVIDERS, provide(LocationStrategy,

{useClass: HashLocationStrategy})]);
Basic Routing
@Component({

selector: 'basic-routing',

template: `<a [routerLink]="['/Home']">Home</a>

<a [routerLink]="['/ProductDetail',
{id:1234}]">Product Details</a>

<router-outlet></router-outlet>`,

directives: [ ROUTER_DIRECTIVES]

})

@RouteConfig([

{path: '/', component: HomeComponent, as: 'Home'},



{path: '/product/:id', component: ProductDetailComponent, 

as: 'ProductDetail'}



])

class RootComponent{}



bootstrap(RootComponent, [ROUTER_PROVIDERS,

provide(LocationStrategy, {useClass: HashLocationStrategy})]);
Passing Data to a Route
@Component({

selector: ‘product',


template: `<h1 class="product">Product Detail for Product: 

{{productID}}</h1>`,


styles: ['product {background: cyan}']

})


export class ProductDetailComponent {

productID: string;
constructor(params: RouteParams){



this.productID = params.get('id');

}

}
Receiving Data in a Route
1
2
3
Reactive Programming
• Angular comes with RxJS library of reactive extensions

• A observable stream emits the data over time to the
subscriber.
• Supports multiple operators to transform the stream’s data

• Stream samples: 

- UI events

- HTTP responses

- Data arriving over websockets
Observable Streams
• Emit the next element
• Throw an error
• Send a signal that the streaming is over
An observable stream can:
Observers
• A function to handle streaming object
• Error handling
• End-of-stream handling
An observer provides:
Transforming the stream
Observables vs Promises
• Observable can return multiple values
• Observables can be cancelled
• Observables allow to handle end-of-stream
Observable Events@Component({

selector: "app",

template: `

<h2>Observable events demo</h2>

<input type="text" placeholder="Enter stock" [ngFormControl]="searchInput">

`

})

class AppComponent {



searchInput: Control;



constructor(){

this.searchInput = new Control('');



this.searchInput.valueChanges

.debounceTime(500)

.subscribe(stock => this.getStockQuoteFromServer(stock));

}



getStockQuoteFromServer(stock) {



console.log(`The price of ${stock} is ${100*Math.random().toFixed(4)}`);

}

}
Observable
Http and Observables


class AppComponent {



products: Array<string> = [];



constructor(private http: Http) {



this.http.get(‘http://localhost:8080/products')

.map(res => res.json())

.subscribe(

data => {



this.products=data;

},



err =>

console.log("Can't get products. Error code: %s, URL: %s ",

err.status, err.url),



() => console.log('Product(s) are retrieved')

);

}

}
DI
O
b
s
e
r
v
e
r
Deployment
• We use Webpack bundler for packaging
• npm scripts for running the build scripts
The app
index.html
Frameworks
Preparing deployment with Webpack
• Input: the entry point(s) of your app
• Output: transpiled bundle (a .js file)
• Resources (css, images, html) can be inlined in the bundle
• Usually, the app will have at least two bundles:



- your code (e.g. bundle.js)



- frameworks and libraries (e.g. vendor.bundle.js)
Webpack Loaders & Plugins
• Loaders operate on a single file (e.g. transpile TS into JS)
• Plugins can operate on multiple files and be invoked at
different stages of the Webpack lifecycle
…
module.exports = {

debug: false,

devtool: 'source-map',

entry: {

'main' : './src/main.ts',

'vendor': './src/vendor.ts'

},

metadata: metadata,

module: {

loaders: [

{test: /.css$/, loader: 'to-string!css'},

{test: /.html$/, loader: 'raw'},

{test: /.ts$/, loader: 'ts'}

],

noParse: [path.join(__dirname, 'node_modules', 'angular2', 'bundles')]

},

output: {

path : './dist',

filename: 'bundle.js'

},

plugins: [

new CommonsChunkPlugin({name: 'vendor', filename: 'vendor.bundle.js', minChunks: Infinity}),

new CompressionPlugin({regExp: /.css$|.html$|.js$|.map$/, threshold: 1500}),

new CopyWebpackPlugin([{from: './src/index.html', to: 'index.html'}]),

new DedupePlugin(),

new DefinePlugin({'webpack': {'ENV': JSON.stringify(metadata.ENV)}}),

new OccurenceOrderPlugin(true),

new UglifyJsPlugin({

compress : {screw_ie8 : true},

mangle: {

screw_ie8 : true,

except: ['RouterLink'] // TODO: Remove after #6678 fixed

}

})

],

resolve: {

extensions: ['', '.ts', '.js']

}

webpack.config.js
npm scripts in package.json
"scripts": {



"clean": "rimraf dist",



"postinstall": "typings install",



"prebuild": "npm run clean",

"build": "webpack --config webpack.prod.config.js --progress —profile --display-cached",



"start": "webpack-dev-server --inline --progress --display-cached --port 8080",



"preserve:dist": "npm run build",

"serve:dist": "static dist -z"

}
To run a script from the command line:



npm start
or
npm run build
or
npm run serve:dist
Links
• A two-day Angular 2 workshop, March 28-29, 2016, New York,

http://bit.ly/1R0FAhN 

discount code: jugmember
• Angular consulting/training: faratasystems.com
• Blog: yakovfain.com
• Our book: http://bit.ly/1QYeqL0




More Related Content

PDF
Java Intro: Unit1. Hello World
PDF
Tech Webinar: Angular 2, Introduction to a new framework
PDF
Angular 2 Essential Training
PDF
Intro to JavaScript
PDF
Using JHipster for generating Angular/Spring Boot apps
PDF
Using JHipster for generating Angular/Spring Boot apps
PDF
Overview of the AngularJS framework
PDF
Using JHipster 4 for generating Angular/Spring Boot apps
Java Intro: Unit1. Hello World
Tech Webinar: Angular 2, Introduction to a new framework
Angular 2 Essential Training
Intro to JavaScript
Using JHipster for generating Angular/Spring Boot apps
Using JHipster for generating Angular/Spring Boot apps
Overview of the AngularJS framework
Using JHipster 4 for generating Angular/Spring Boot apps

What's hot (20)

PPTX
PPTX
Single Page Applications with AngularJS 2.0
PPTX
PDF
Introduction to angular 4
PDF
Quick introduction to Angular 4 for AngularJS 1.5 developers
PDF
Angular 2 - The Next Framework
PPTX
PPTX
Angular elements - embed your angular components EVERYWHERE
PDF
Type script for_java_dev_jul_2020
PPTX
Angular 2 Migration - JHipster Meetup 6
PPTX
Angular1x and Angular 2 for Beginners
PDF
Developing a Demo Application with Angular 4 - J2I
PDF
Angular 2: core concepts
PPT
PDF
Top 7 Angular Best Practices to Organize Your Angular App
PPTX
What’s new in angular 2
PDF
RESTful services and OAUTH protocol in IoT
PDF
Angular 2: What's New?
PPTX
Introduction to angular 2
PDF
Angular Dependency Injection
Single Page Applications with AngularJS 2.0
Introduction to angular 4
Quick introduction to Angular 4 for AngularJS 1.5 developers
Angular 2 - The Next Framework
Angular elements - embed your angular components EVERYWHERE
Type script for_java_dev_jul_2020
Angular 2 Migration - JHipster Meetup 6
Angular1x and Angular 2 for Beginners
Developing a Demo Application with Angular 4 - J2I
Angular 2: core concepts
Top 7 Angular Best Practices to Organize Your Angular App
What’s new in angular 2
RESTful services and OAUTH protocol in IoT
Angular 2: What's New?
Introduction to angular 2
Angular Dependency Injection
Ad

Similar to Angular 2 for Java Developers (20)

PDF
Angular2 Development for Java developers
PDF
better-apps-angular-2-day1.pdf and home
PPTX
Angularj2.0
PPTX
Angularjs2 presentation
PPTX
Angular 2 with typescript
PDF
Angular2 tutorial
PPTX
The advantage of developing with TypeScript
PPTX
AngularConf2015
PDF
Angular2 with type script
PPTX
Moving From AngularJS to Angular 2
PDF
Angular 4 for Java Developers
PDF
IPT angular2 typescript SPA 2016
PDF
Angular JS2 Training Session #1
PPTX
Angular 9
PDF
Angular for Java Enterprise Developers: Oracle Code One 2018
PPT
Angular.ppt
PDF
Angular 2 overview in 60 minutes
PPTX
Dive into Angular, part 4: Angular 2.0
PPTX
Building a TV show with Angular, Bootstrap, and Web Services
PPTX
Angular 2 On Production (IT Talk in Dnipro)
Angular2 Development for Java developers
better-apps-angular-2-day1.pdf and home
Angularj2.0
Angularjs2 presentation
Angular 2 with typescript
Angular2 tutorial
The advantage of developing with TypeScript
AngularConf2015
Angular2 with type script
Moving From AngularJS to Angular 2
Angular 4 for Java Developers
IPT angular2 typescript SPA 2016
Angular JS2 Training Session #1
Angular 9
Angular for Java Enterprise Developers: Oracle Code One 2018
Angular.ppt
Angular 2 overview in 60 minutes
Dive into Angular, part 4: Angular 2.0
Building a TV show with Angular, Bootstrap, and Web Services
Angular 2 On Production (IT Talk in Dnipro)
Ad

More from Yakov Fain (14)

PDF
Web sockets in Angular
PDF
TypeScript for Java Developers
PDF
Reactive Streams and RxJava2
PDF
Reactive programming in Angular 2
PDF
Reactive Thinking in Java with RxJava2
PDF
Reactive Thinking in Java
PDF
Dart for Java Developers
PDF
Integrating consumers IoT devices into Business Workflow
PDF
Seven Versions of One Web Application
PDF
Running a Virtual Company
PDF
Princeton jug git_github
PDF
Speed up your Web applications with HTML5 WebSockets
PDF
Surviving as a Professional Software Developer
PDF
Becoming a professional software developer
Web sockets in Angular
TypeScript for Java Developers
Reactive Streams and RxJava2
Reactive programming in Angular 2
Reactive Thinking in Java with RxJava2
Reactive Thinking in Java
Dart for Java Developers
Integrating consumers IoT devices into Business Workflow
Seven Versions of One Web Application
Running a Virtual Company
Princeton jug git_github
Speed up your Web applications with HTML5 WebSockets
Surviving as a Professional Software Developer
Becoming a professional software developer

Recently uploaded (20)

PPTX
Cloud computing and distributed systems.
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Encapsulation theory and applications.pdf
PDF
Modernizing your data center with Dell and AMD
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Spectral efficient network and resource selection model in 5G networks
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
KodekX | Application Modernization Development
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
Big Data Technologies - Introduction.pptx
Cloud computing and distributed systems.
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Encapsulation theory and applications.pdf
Modernizing your data center with Dell and AMD
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
“AI and Expert System Decision Support & Business Intelligence Systems”
The Rise and Fall of 3GPP – Time for a Sabbatical?
Spectral efficient network and resource selection model in 5G networks
The AUB Centre for AI in Media Proposal.docx
Advanced methodologies resolving dimensionality complications for autism neur...
NewMind AI Monthly Chronicles - July 2025
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Understanding_Digital_Forensics_Presentation.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
MYSQL Presentation for SQL database connectivity
Mobile App Security Testing_ A Comprehensive Guide.pdf
Empathic Computing: Creating Shared Understanding
KodekX | Application Modernization Development
Chapter 3 Spatial Domain Image Processing.pdf
Big Data Technologies - Introduction.pptx

Angular 2 for Java Developers

  • 1. Angular 2 for Java Developers Yakov Fain, Farata Systems March 10, 2016
  • 2. Angular 2 • Complete re-write of AngularJS • Component-based • Better performance • No controllers, scopes • Streamlined Dependency Injection • Integrated RxJS • Can write apps in TypeScript, 
 Dart, or JavaScript (ES5 or ES6)
  • 3. An app is a tree of components
  • 7. Project Structure Config files App dependencies App code {
  • 8. Project Structure SystemJS transpiles TS and loads JS bootstrap(ApplicationComponent)
  • 11. import {Component} from 'angular2/core';
 import {Product, ProductService} from 'app/services/product-service'; import CarouselComponent from '../carousel/carousel';
 import ProductItemComponent from '../product-item/product-item';
 import {ProductService} from '../../services/product-service';
 
 @Component({
 selector: 'auction-home-page',
 directives: [
 CarouselComponent,
 ProductItemComponent
 ],
 styleUrls: ['app/components/home/home.css'],
 template: `
 <div class="row carousel-holder">
 <div class="col-md-12">
 <auction-carousel></auction-carousel>
 </div>
 </div>
 <div class="row">
 <div *ngFor="#product of products" class="col-sm-4 col-lg-4 col <auction-product-item [product]="product"></auction-product-i </div>
 </div>
 `
 })
 export default class HomeComponent {
 products: Product[] = [];
 
 constructor(private productService: ProductService) {
 this.products = this.productService.getProducts();
 }
 }
 Exporing a
 module HomeComponent Importing
 Modules
  • 12. Dependency Injection HomeComponent import {Component} from 'angular2/core';
 import {Product, ProductService} from 'app/services/product-service'; import CarouselComponent from '../carousel/carousel';
 import ProductItemComponent from '../product-item/product-item';
 import {ProductService} from '../../services/product-service';
 
 @Component({
 selector: 'auction-home-page',
 directives: [
 CarouselComponent,
 ProductItemComponent
 ],
 styleUrls: ['app/components/home/home.css'],
 template: `
 <div class="row carousel-holder">
 <div class="col-md-12">
 <auction-carousel></auction-carousel>
 </div>
 </div>
 <div class="row">
 <div *ngFor="#product of products" class="col-sm-4 col-lg-4 col <auction-product-item [product]="product"></auction-product-i </div>
 </div>
 `
 })
 export default class HomeComponent {
 products: Product[] = [];
 
 constructor(private productService: ProductService) {
 this.products = this.productService.getProducts();
 }
 }

  • 13. import {Component} from 'angular2/core';
 import {Product, ProductService} from 'app/services/product-service'; import CarouselComponent from '../carousel/carousel';
 import ProductItemComponent from '../product-item/product-item';
 import {ProductService} from '../../services/product-service';
 
 @Component({
 selector: 'auction-home-page',
 directives: [
 CarouselComponent,
 ProductItemComponent
 ],
 styleUrls: ['app/components/home/home.css'],
 template: `
 <div class="row carousel-holder">
 <div class="col-md-12">
 <auction-carousel></auction-carousel>
 </div>
 </div>
 <div class="row">
 <div *ngFor="#product of products" class="col-sm-4 col-lg-4 col <auction-product-item [product]="product"></auction-product-i </div>
 </div>
 `
 })
 export default class HomeComponent {
 products: Product[] = [];
 
 constructor(private productService: ProductService) {
 this.products = this.productService.getProducts();
 }
 }
 Looping with *ngFor
  • 16. What’s TypeScript? • An open-source language developed by Microsoft • Designed by Anders Hejlsberg, the creator of C#, Delphi, and Turbo Pascal • A superset of JavaScript • Well supported by IDEs
  • 17. Benefits of Writing in TypeScript • Increases your productivity in producing JavaScript • Supports types, classes, interfaces, generics, annotations • Compiles into a human-readable JavaScript • Easy to learn by Java developers • Supports most of the ES6 and some ES7 syntax
  • 20. A Class With Constructor TypeScript JavaScript (E5)
  • 23. Arrow Function Expressions (lambdas) var getName = () => 'John Smith'; console.log(`The name is ` + getName());
  • 26. TypeScript Compiler: tsc • Install the typescript compiler with npm (comes with Node.js):
 
 npm install -g typescript • Compile main.ts into main.js specifying target language syntax:
 
 tsc —t ES5 main.ts • Usually the compiler’s options are set in tsconfig.json file • The watch mode allows to auto-compile as files change:
 
 tsc -w *.ts
  • 27. import {bootstrap} from 'angular2/platform/browser'; import {Component} from 'angular2/core'; @Component({ selector: 'hello-world', template: '<h1>Hello {{ name }}!</h1>' }) class HelloWorldComponent { name: string; constructor() { this.name = ‘World!'; } } bootstrap(HelloWorldComponent); HelloWorldComponent in Angular In HTML:
 
 <hello-world></hello-world>
  • 28. SystemJS: a Universal Module Loader • ES6 defines modules, but not the loader • ES7 should include the System object for loading modules • SystemJS is a polyfill that loads modules
  • 29. Index.html Take 1 <!DOCTYPE html> <html> <head> <script src="//npmcdn.com/angular2@2.0.0-beta.7/bundles/angular2-polyfills.js"></script> <script src="//npmcdn.com/typescript@1.7.5/lib/typescript.js"></script> <script src="//npmcdn.com/systemjs@0.19.22/dist/system.src.js"></script> <script src="//npmcdn.com/rxjs@5.0.0-beta.2/bundles/Rx.js"></script> <script src="//npmcdn.com/angular2@2.0.0-beta.7/bundles/angular2.dev.js"></script> 
 <script> System.config({ transpiler: 'typescript', typescriptOptions: {emitDecoratorMetadata: true} }); System.import('main.ts'); </script> </head> <body> <hello-world></hello-world> </body> </html> Angular from CDN SystemJS HelloWorldComponent
  • 30. Starting a new project with npm 1. Generate package.json for your project:
 npm init -y 2. Add Angular dependencies to package.json 3. Download dependencies into the dir node_modules: 
 npm install 4. Install live-server
 npm install live-server -g
  • 31. package.json { "name": "walkthrough5", "version": "1.0.0", "description": “A sample package.json for the Angular app”, "scripts": { "start": "live-server" }, "dependencies": { "es6-shim": "0.33.13", "es6-promise": "^3.0.2", "reflect-metadata": "0.1.2", "rxjs": "5.0.0-beta.2", "systemjs": "0.19.23", "zone.js": "0.5.15", "angular2": "2.0.0-beta.9" }, 
 "devDependencies": { "live-server": "^0.9.0", "typescript": "^1.7.5" } }
  • 32. <!DOCTYPE html> <html> <head> <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script> <script src="node_modules/typescript/lib/typescript.js"></script> <script src="node_modules/systemjs/dist/system.src.js"></script> <script src="node_modules/rxjs/bundles/Rx.js"></script> <script src="node_modules/angular2/bundles/angular2.dev.js"></script> <script> System.config({ transpiler: 'typescript', typescriptOptions: {emitDecoratorMetadata: true} }); System.import('main.ts'); </script> </head> <body> <hello-world></hello-world> </body> </html> Index.html Take 2 Angular’s local (after npm install)
  • 33. Templates • A place to write HTML • Rendering is separated from the core framework • Angular team works with Telerik on rendering for iOS and Android using NativeScript @Component({
 selector: 'auction-home-page',
 …
 styleUrls: ['app/components/home/home.css'],
 template: `
 <div class="row carousel-holder">
 <div class="col-md-12">
 <auction-carousel></auction-carousel>
 </div>
 </div>
 <div class="row">
 <div class="col-md-12">
 <div class="form-group">
 <input placeholder="Filter products by title” type="text">
 </div>
 </div>
 </div>
 `
 })
  • 34. Unidirectional Binding From code to template: <h1>Hello {{ name }}!</h1> <span [hidden]=“isZipcodeValid”>Zip code is not valid</span> From template to code: <button (click)="placeBid()">Place Bid</button> <input placeholder= "Product name" (input)="onInputEvent()">
  • 35. Two-way Binding Synchronizing Model and View: <input [value]="myComponentProperty" 
 (input)=“onInputEvent($event)> <input [(ngModel)] = "myComponentProperty">
  • 36. Dependency Injection • Angular can create services; no need to use the new operator • Angular injects objects into components via constructors only • Each component has an injector • Providers specify how to inject • If a component has no provider defined, Angular checks its parent
  • 37. product-service.ts export class Product {
 constructor(
 public id: number,
 public title: string,
 public price: number,
 public description: string) {
 }
 }
 
 export class ProductService {
 getProduct(): Product {
 return new Product( 0, "iPhone 7", 249.99, "The latest iPhone, 7-inch screen");
 }
 }
  • 38. Injecting ProductService import {Component, bind} from 'angular2/core';
 import {ProductService, Product} from "../services/product-service";
 
 @Component({
 selector: 'di-product-page',
 template: `<div>
 <h1>Product Details</h1>
 <h2>Title: {{product.title}}</h2>
 <h2>Description: {{product.description}}</h2>
 <h2>Price: ${{product.price}}</h2>
 </div>`,
 providers:[ProductService]
 })
 
 export default class ProductComponent {
 product: Product;
 
 constructor( productService: ProductService) {
 
 this.product = productService.getProduct();
 }
 }
 A provider can be a class, factory, or a value Injection
  • 40. Injecting Dependencies of Dependencies import {Http} from 'angular2/http'; @Injectable export class ProductService { constructor(private http:Http){ let products = http.get('products.json'); } … }
  • 41. Routing Bulding Blocks • RouterOutlet (<router-outlet>) - where the router should render the component • @RouteConfig - map URLs to components to be rendered inside the <router-outlet> • RouterLink ([routerLink]) - a link to a named route. • RouteParams - a map of key-value pairs to pass parameters to the route • RouteData - a map of key-value pairs used to pass additional data from @RouteConfig to a route
  • 42. @Component({
 selector: ‘basic-routing', 
 template: `<a [routerLink]="['/Home']">Home</a>
 <a [routerLink]="['/ProductDetail']">Product Details</a>
 <router-outlet></router-outlet>`,
 directives: [ ROUTER_DIRECTIVES]
 })
 
 @RouteConfig([
 {path: '/', component: HomeComponent, as: 'Home'},
 {path: '/product', component: ProductDetailComponent, as: 'ProductDetail'}
 ])
 class RootComponent{
 }
 
 bootstrap(RootComponent, [ROUTER_PROVIDERS, provide(LocationStrategy,
 {useClass: HashLocationStrategy})]); Basic Routing
  • 43. @Component({
 selector: 'basic-routing',
 template: `<a [routerLink]="['/Home']">Home</a>
 <a [routerLink]="['/ProductDetail', {id:1234}]">Product Details</a>
 <router-outlet></router-outlet>`,
 directives: [ ROUTER_DIRECTIVES]
 })
 @RouteConfig([
 {path: '/', component: HomeComponent, as: 'Home'},
 
 {path: '/product/:id', component: ProductDetailComponent, 
 as: 'ProductDetail'}
 
 ])
 class RootComponent{}
 
 bootstrap(RootComponent, [ROUTER_PROVIDERS,
 provide(LocationStrategy, {useClass: HashLocationStrategy})]); Passing Data to a Route
  • 44. @Component({
 selector: ‘product', 
 template: `<h1 class="product">Product Detail for Product: 
 {{productID}}</h1>`, 
 styles: ['product {background: cyan}']
 }) 
 export class ProductDetailComponent {
 productID: string; constructor(params: RouteParams){
 
 this.productID = params.get('id');
 }
 } Receiving Data in a Route 1 2 3
  • 45. Reactive Programming • Angular comes with RxJS library of reactive extensions
 • A observable stream emits the data over time to the subscriber. • Supports multiple operators to transform the stream’s data
 • Stream samples: 
 - UI events
 - HTTP responses
 - Data arriving over websockets
  • 46. Observable Streams • Emit the next element • Throw an error • Send a signal that the streaming is over An observable stream can:
  • 47. Observers • A function to handle streaming object • Error handling • End-of-stream handling An observer provides:
  • 49. Observables vs Promises • Observable can return multiple values • Observables can be cancelled • Observables allow to handle end-of-stream
  • 50. Observable Events@Component({
 selector: "app",
 template: `
 <h2>Observable events demo</h2>
 <input type="text" placeholder="Enter stock" [ngFormControl]="searchInput">
 `
 })
 class AppComponent {
 
 searchInput: Control;
 
 constructor(){
 this.searchInput = new Control('');
 
 this.searchInput.valueChanges
 .debounceTime(500)
 .subscribe(stock => this.getStockQuoteFromServer(stock));
 }
 
 getStockQuoteFromServer(stock) {
 
 console.log(`The price of ${stock} is ${100*Math.random().toFixed(4)}`);
 }
 } Observable
  • 51. Http and Observables 
 class AppComponent {
 
 products: Array<string> = [];
 
 constructor(private http: Http) {
 
 this.http.get(‘http://localhost:8080/products')
 .map(res => res.json())
 .subscribe(
 data => {
 
 this.products=data;
 },
 
 err =>
 console.log("Can't get products. Error code: %s, URL: %s ",
 err.status, err.url),
 
 () => console.log('Product(s) are retrieved')
 );
 }
 } DI O b s e r v e r
  • 52. Deployment • We use Webpack bundler for packaging • npm scripts for running the build scripts The app index.html Frameworks
  • 53. Preparing deployment with Webpack • Input: the entry point(s) of your app • Output: transpiled bundle (a .js file) • Resources (css, images, html) can be inlined in the bundle • Usually, the app will have at least two bundles:
 
 - your code (e.g. bundle.js)
 
 - frameworks and libraries (e.g. vendor.bundle.js)
  • 54. Webpack Loaders & Plugins • Loaders operate on a single file (e.g. transpile TS into JS) • Plugins can operate on multiple files and be invoked at different stages of the Webpack lifecycle
  • 55. … module.exports = {
 debug: false,
 devtool: 'source-map',
 entry: {
 'main' : './src/main.ts',
 'vendor': './src/vendor.ts'
 },
 metadata: metadata,
 module: {
 loaders: [
 {test: /.css$/, loader: 'to-string!css'},
 {test: /.html$/, loader: 'raw'},
 {test: /.ts$/, loader: 'ts'}
 ],
 noParse: [path.join(__dirname, 'node_modules', 'angular2', 'bundles')]
 },
 output: {
 path : './dist',
 filename: 'bundle.js'
 },
 plugins: [
 new CommonsChunkPlugin({name: 'vendor', filename: 'vendor.bundle.js', minChunks: Infinity}),
 new CompressionPlugin({regExp: /.css$|.html$|.js$|.map$/, threshold: 1500}),
 new CopyWebpackPlugin([{from: './src/index.html', to: 'index.html'}]),
 new DedupePlugin(),
 new DefinePlugin({'webpack': {'ENV': JSON.stringify(metadata.ENV)}}),
 new OccurenceOrderPlugin(true),
 new UglifyJsPlugin({
 compress : {screw_ie8 : true},
 mangle: {
 screw_ie8 : true,
 except: ['RouterLink'] // TODO: Remove after #6678 fixed
 }
 })
 ],
 resolve: {
 extensions: ['', '.ts', '.js']
 }
 webpack.config.js
  • 56. npm scripts in package.json "scripts": {
 
 "clean": "rimraf dist",
 
 "postinstall": "typings install",
 
 "prebuild": "npm run clean",
 "build": "webpack --config webpack.prod.config.js --progress —profile --display-cached",
 
 "start": "webpack-dev-server --inline --progress --display-cached --port 8080",
 
 "preserve:dist": "npm run build",
 "serve:dist": "static dist -z"
 } To run a script from the command line:
 
 npm start or npm run build or npm run serve:dist
  • 57. Links • A two-day Angular 2 workshop, March 28-29, 2016, New York,
 http://bit.ly/1R0FAhN 
 discount code: jugmember • Angular consulting/training: faratasystems.com • Blog: yakovfain.com • Our book: http://bit.ly/1QYeqL0