Building Universal Applications with Angular 2 Minko Gechev github.com/mgechev twitter.com/mgechev blog.mgechev.com
github.com/mgechev twitter.com/mgechev blog.mgechev.com
Agenda What is Angular? What’s wrong with Angular 2? Introduction to Angular 2 Why Angular 2 is awesome? Should I use Angular 2 in my next project?
Agenda What is Angular 2? What’s wrong with Angular 2? What are the core concepts of Angular 2? Why Angular 2 is awesome? Should I use Angular 2 in my next project?
Agenda What is Angular 2? What’s wrong with Angular 2? What are the core concepts of Angular 2? Why Angular 2 is awesome? Should I use Angular 2 in my next project?
Agenda What is Angular 2? What’s wrong with Angular 2? What are the core concepts of Angular 2? Why Angular 2 is awesome? Should I use Angular 2 in my next project?
Agenda What is Angular 2? What’s wrong with Angular 2? What are the core concepts of Angular 2? Why Angular 2 is awesome? Should I use Angular 2 in my next project?
Agenda What is Angular 2? What’s wrong with Angular 2? What are the core concepts of Angular 2? Why Angular 2 is awesome? Should I use Angular 2 in my next project?
What is Angular 2?
Core concepts of Angular 2 • Directives • Components • Pipes • Services • Dependency Injection
Directives
Primitive used for encapsulation of basic UI related logic
tooltip.ts @Directive({ selector: '[tooltip]', inputs: ['tooltip'], host: { '(mouseenter)': 'onMouseEnter()', '(mouseleave)': 'onMouseLeave()' } }) export class Tooltip { private overlay:Overlay; private tooltip:string; constructor(private el:ElementRef, manager: OverlayManager) { this.el = el; this.overlay = manager.get(); } onMouseEnter() { this.overlay.open(this.el, this.tooltip); } onMouseLeave() { this.overlay.close(); } }
tooltip.ts @Directive({ selector: '[tooltip]', inputs: ['tooltip'], host: { '(mouseenter)': 'onMouseEnter()', '(mouseleave)': 'onMouseLeave()' } }) export class Tooltip { private overlay:Overlay; private tooltip:string; constructor(private el:ElementRef, manager: OverlayManager) { this.el = el; this.overlay = manager.get(); } onMouseEnter() { this.overlay.open(this.el, this.tooltip); } onMouseLeave() { this.overlay.close(); } }
tooltip.ts @Directive({ selector: '[tooltip]', inputs: ['tooltip'], host: { '(mouseenter)': 'onMouseEnter()', '(mouseleave)': 'onMouseLeave()' } }) export class Tooltip { private overlay:Overlay; private tooltip:string; constructor(private el:ElementRef, manager: OverlayManager) { this.el = el; this.overlay = manager.get(); } onMouseEnter() { this.overlay.open(this.el, this.tooltip); } onMouseLeave() { this.overlay.close(); } }
What a minute… this looks like Java
Angular 2 is written in TypeScript
TypeScript is…
superset of ECMAScript
optional type checking
open source
…you can still use ES5…
tooltip.js var Tooltip = ng.Directive({ selector: '[tooltip]', inputs: ['tooltip'], host: { '(mouseenter)': 'onMouseEnter()', '(mouseleave)': 'onMouseLeave()' } }) .Class({ constructor: [ng.Inject(ng.ElementRef), ng.Inject(OverlayManager), function (tooltip, el, manager) { this.el = el; this.overlay = manager.get(tooltip); }], onMouseEnter() { this.overlay.open(this.el, this.tooltip); }, onMouseLeave() { this.overlay.close(); } });
tooltip.js var Tooltip = ng.Directive({ selector: '[tooltip]', inputs: ['tooltip'], host: { '(mouseenter)': 'onMouseEnter()', '(mouseleave)': 'onMouseLeave()' } }) .Class({ constructor: [ng.Inject(ng.ElementRef), ng.Inject(OverlayManager), function (tooltip, el, manager) { this.el = el; this.overlay = manager.get(tooltip); }], onMouseEnter() { this.overlay.open(this.el, this.tooltip); }, onMouseLeave() { this.overlay.close(); } });
tooltip.js var Tooltip = ng.Directive({ selector: '[tooltip]', inputs: ['tooltip'], host: { '(mouseenter)': 'onMouseEnter()', '(mouseleave)': 'onMouseLeave()' } }) .Class({ constructor: [ng.Inject(ng.ElementRef), ng.Inject(OverlayManager), function (tooltip, el, manager) { this.el = el; this.overlay = manager.get(tooltip); }], onMouseEnter() { this.overlay.open(this.el, this.tooltip); }, onMouseLeave() { this.overlay.close(); } });
Components
Directives with views
hello-world.ts @Component({ selector: 'hello-world' }) @View({ template: '<h1>Hello, {{this.target}}!</h1>' }) class HelloWorld { target:string; constructor() { this.target = 'world'; } }
hello-world.ts @Component({ selector: 'hello-world' }) @View({ template: '<h1>Hello, {{this.target}}!</h1>' }) class HelloWorld { target:string; constructor() { this.target = 'world'; } }
hello-world.ts @Component({ selector: 'hello-world' }) @View({ template: '<h1>Hello, {{this.target}}!</h1>' }) class HelloWorld { target:string; constructor() { this.target = 'world'; } }
Pipes
Encapsulate the data transformation logic
lowercase-pipe.ts @Pipe({ name: 'lowercase' }) class LowerCasePipe implements PipeTransform { transform(value: string): string { if (!value) return value; if (typeof value !== 'string') { throw new Error('Invalid pipe value', value); } return value.toLowerCase(); } }
Services
Simply, ES2015 classes which can be wired together with…
Dependency Injection
di.ts import { provide, Injector, Injectable } from 'angular2/angular2'; @Injectable() class DataMapper { constructor(private http: Http) {} } class Http {} let injector = Injector.resolveAndCreate([ provide(Http).toValue(new Http()), DataMapper ]); injector.get(DataMapper);
di.ts import { provide, Injector, Injectable } from 'angular2/angular2'; @Injectable() class DataMapper { constructor(private http: Http) {} } class Http {} let injector = Injector.resolveAndCreate([ provide(Http).toValue(new Http()), DataMapper ]); injector.get(DataMapper);
di.ts import { provide, Injector, Injectable } from 'angular2/angular2'; @Injectable() class DataMapper { constructor(private http: Http) {} } class Http {} let injector = Injector.resolveAndCreate([ provide(Http).toValue(new Http()), DataMapper ]); injector.get(DataMapper);
di.ts import { provide, Injector, Injectable } from 'angular2/angular2'; @Injectable() class DataMapper { constructor(private http: Http) {} } class Http {} let injector = Injector.resolveAndCreate([ provide(Http).toValue(new Http()), DataMapper ]); injector.get(DataMapper);
Now you know the basics!
Lets take a step back…
Angular 2 is platform agnostic
Not coupled with DOM, even HTML
…and even more…
Client Server
Client Server
Client Server GET / GET * loop
Client Server GET / GET * loop Running JavaScript
Client Server GET / GET * loop GET * loop
Client Server GET / GET * loop GET * loop
server-side rendering
Client Server
Client Server
Client Server GET /
Client Server GET / Running JavaScript
Client Server GET / GET * loop
Client Server GET / GET * loop Running JavaScript
Client Server GET / GET * loop
Change detection can be run into separate process
so…what’s wrong with Angular 2?
Google
Google Angular 1
Angular 2 Google Angular 1
Angular 2 is…
rewritten from scratch
…developed in a different language
…completely incompatible API
…brand new building blocks
Why?
Web have moved forward
WebWorkers
Learnt lessons
Mutable state
Tangled data-flow
…we will make the transition process boring…
ngUpgrade
How to migrate to Angular 2? (2 easy steps)
Step 1
A B C D E F
Step 2
Thank you! github.com/mgechev twitter.com/mgechev blog.mgechev.com

Building Universal Applications with Angular 2