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

What's hot (20)

PPTX
Angular 2
Travis van der Font
 
PPTX
Single Page Applications with AngularJS 2.0
Sumanth Chinthagunta
 
PPTX
Angular 5
Bartłomiej Narożnik
 
PDF
Introduction to angular 4
Marwane El Azami
 
PDF
Quick introduction to Angular 4 for AngularJS 1.5 developers
Paweł Żurowski
 
PDF
Angular 2 - The Next Framework
Commit University
 
PPTX
An Overview of Angular 4
Cynoteck Technology Solutions Private Limited
 
PPTX
Angular elements - embed your angular components EVERYWHERE
Nadav Mary
 
PDF
Type script for_java_dev_jul_2020
Yakov Fain
 
PPTX
Angular 2 Migration - JHipster Meetup 6
William Marques
 
PPTX
Angular1x and Angular 2 for Beginners
Oswald Campesato
 
PDF
Developing a Demo Application with Angular 4 - J2I
Nader Debbabi
 
PDF
Angular 2: core concepts
Codemotion
 
PPT
React native
Mohammed El Rafie Tarabay
 
PDF
Top 7 Angular Best Practices to Organize Your Angular App
Katy Slemon
 
PPTX
What’s new in angular 2
Ran Wahle
 
PDF
RESTful services and OAUTH protocol in IoT
Yakov Fain
 
PDF
Angular 2: What's New?
jbandi
 
PPTX
Introduction to angular 2
Dor Moshe
 
PDF
Angular Dependency Injection
Nir Kaufman
 
Single Page Applications with AngularJS 2.0
Sumanth Chinthagunta
 
Introduction to angular 4
Marwane El Azami
 
Quick introduction to Angular 4 for AngularJS 1.5 developers
Paweł Żurowski
 
Angular 2 - The Next Framework
Commit University
 
Angular elements - embed your angular components EVERYWHERE
Nadav Mary
 
Type script for_java_dev_jul_2020
Yakov Fain
 
Angular 2 Migration - JHipster Meetup 6
William Marques
 
Angular1x and Angular 2 for Beginners
Oswald Campesato
 
Developing a Demo Application with Angular 4 - J2I
Nader Debbabi
 
Angular 2: core concepts
Codemotion
 
Top 7 Angular Best Practices to Organize Your Angular App
Katy Slemon
 
What’s new in angular 2
Ran Wahle
 
RESTful services and OAUTH protocol in IoT
Yakov Fain
 
Angular 2: What's New?
jbandi
 
Introduction to angular 2
Dor Moshe
 
Angular Dependency Injection
Nir Kaufman
 

Similar to Angular 2 for Java Developers (20)

PDF
Angular2 Development for Java developers
Yakov Fain
 
PDF
better-apps-angular-2-day1.pdf and home
ChethanGowda886434
 
PPTX
Angularj2.0
Mallikarjuna G D
 
PPTX
Angularjs2 presentation
dharisk
 
PPTX
Angular 2 with typescript
Tayseer_Emam
 
PDF
Angular2 tutorial
HarikaReddy115
 
PPTX
The advantage of developing with TypeScript
Corley S.r.l.
 
PPTX
AngularConf2015
Alessandro Giorgetti
 
PDF
Angular2 with type script
Ravi Mone
 
PPTX
Moving From AngularJS to Angular 2
Exilesoft
 
PDF
Angular 4 for Java Developers
Yakov Fain
 
PDF
IPT angular2 typescript SPA 2016
Trayan Iliev
 
PDF
Angular JS2 Training Session #1
Paras Mendiratta
 
PPTX
Angular 9
Raja Vishnu
 
PDF
Angular for Java Enterprise Developers: Oracle Code One 2018
Loiane Groner
 
PPT
Angular.ppt
Mytrux1
 
PDF
Angular 2 overview in 60 minutes
Loiane Groner
 
PPTX
Dive into Angular, part 4: Angular 2.0
Oleksii Prohonnyi
 
PPTX
Building a TV show with Angular, Bootstrap, and Web Services
David Giard
 
PPTX
Angular 2 On Production (IT Talk in Dnipro)
Oleksandr Tryshchenko
 
Angular2 Development for Java developers
Yakov Fain
 
better-apps-angular-2-day1.pdf and home
ChethanGowda886434
 
Angularj2.0
Mallikarjuna G D
 
Angularjs2 presentation
dharisk
 
Angular 2 with typescript
Tayseer_Emam
 
Angular2 tutorial
HarikaReddy115
 
The advantage of developing with TypeScript
Corley S.r.l.
 
AngularConf2015
Alessandro Giorgetti
 
Angular2 with type script
Ravi Mone
 
Moving From AngularJS to Angular 2
Exilesoft
 
Angular 4 for Java Developers
Yakov Fain
 
IPT angular2 typescript SPA 2016
Trayan Iliev
 
Angular JS2 Training Session #1
Paras Mendiratta
 
Angular 9
Raja Vishnu
 
Angular for Java Enterprise Developers: Oracle Code One 2018
Loiane Groner
 
Angular.ppt
Mytrux1
 
Angular 2 overview in 60 minutes
Loiane Groner
 
Dive into Angular, part 4: Angular 2.0
Oleksii Prohonnyi
 
Building a TV show with Angular, Bootstrap, and Web Services
David Giard
 
Angular 2 On Production (IT Talk in Dnipro)
Oleksandr Tryshchenko
 
Ad

More from Yakov Fain (14)

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

Recently uploaded (20)

PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 

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/[email protected]/bundles/angular2-polyfills.js"></script> <script src="//npmcdn.com/[email protected]/lib/typescript.js"></script> <script src="//npmcdn.com/[email protected]/dist/system.src.js"></script> <script src="//npmcdn.com/[email protected]/bundles/Rx.js"></script> <script src="//npmcdn.com/[email protected]/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