SlideShare a Scribd company logo
Exploring Angular 2
Angular 2
The Next Framework
@cef62

github.com/cef62

Senior frontend engineer @ 

Staff member of Frontenders Verona

Italian React & Angular Communities Maintainer
MATTEO RONCHI
AngularJS history
• AngularJS was originally developed in 2009 by Misko
Hevery and Adam Abrons
• Misko Hevery started to work for Google in 2009
• 1st release of AngularJS: 1 developer, 3 weeks, 1000 loc
• AngularJS version 1.0 was released in 2012 by Google
• Angular version 2 was released in September 2016 after
2 years development
WELCOME TO THE FUTURE
Angular 2 features
• Optimized for both desktop and mobile
• Ahead of Time (AoT) compilation
• Incredible performances
• Native Reactive support
ANGULAR 2 BASICS
@INJECTABLE
export class MyService {
getData() {
return this.loadData.load();
}
}
import { Injectable } from `angular2/core`;
@Injectable()
export class MyService {
constructor(private loadData:LoadData) {}
getData() {
return this.loadData.load();
}
}
ANGULAR 2 BASICS
@COMPONENT
import { Component } from '@angular/core';
@Component({
selector: 'hello',
template: '<p>Hello, {{name}}</p>'
})
export class Hello {
name: string;
constructor() {
this.name = 'World';
}
}
ANGULAR 2 BASICS
@DIRECTIVE
import {
Directive, HostListener
} from '@angular/core';
@Directive({
selector: `[confirm]`
})
export class ConfirmDirective {
@HostListener(`click`, [`$event`])
confirmFirst(event: Event) {
return window.confirm(
`Are you sure you want to do this?`
);
}
}
// Usage
<button type="button"
(click)="visitOtherPage()"
confirm>Visit another page</button>
ANGULAR 2 BASICS
@PIPES
import { Component } from '@angular/core';
@Component({
selector: `product-price`,
template: `<p>Price: {{ price | currency }}</p>`
})
export class ProductPrice {
price: number = 99.99;
}
import { Pipe, PipeTransform } from '@angular/core';
const UNITS = ['B', 'KB', 'MB', 'GB'];
@Pipe({
name: 'formatFileSize'
})
export class FormatSize implements PipeTransform {
transform(
bytes: number = 0,
precision: number = 2
) : string {
if (!isFinite(bytes)) return ‘?';
let unit = 0;
while ( bytes >= 1024 ) {
bytes /= 1024;
unit ++;
}
return bytes.toFixed(precision) + ' ' + UNITS[unit];
}
}
ANGULAR 2 BASICS
HTTP SERVICE
import {Injectable} from '@angular/core';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs';
import {Hero} from './hero';
@Injectable()
export class LoadDataService {
constructor(private http: Http) {}
search(term: string): Observable<Hero[]> {
return this.http
.get(`app/heroes/?name=${term}`)
.map((r: Response) => {
return r.json().data as Hero[]
});
}
}
IN THE ZONE
AngularJS $digest cycle
• AngularJS engine is built using a dirty checking algorithm.
• Application state is a single entity connected to every
visual component and calculated every time a
component mutates some data
• It’s very easy to trigger unwanted $digest cycles
impacting performances
• Very difficult to debug
Angular 2 Change Detection engine
• Based on ngZone
• Recalculate the components tree state after every async
interaction (events, timers, observables..)
• Every component has its own Change Detector
• Component’s Change Detector is generated at runtime
to improve performances
• Developers can control how and when components are
recalculated
– ngBook2
“When one of the components change, no
matter where in the tree it is, a change
detection pass is triggered for the whole tree,
from top to bottom.”
CD
CD CD
CD CDCD
CD CD
CHANGE DETECTION
TRAVELS TOP TO BOTTOM
ChangeDetection
Flow
CHANGE DETECTION IS DEFINED AT
COMPONENT LEVEL
• Every component gets a change detector responsible
for checking the bindings defined in its template
• ChangeDetectionStrategy
• default: update the component every time data
changes
• onPush: update the component only when its
inputs change or the component requests to be
updated
CHANGE DETECTION (onPush)
WITH IMMUTABLE DATA
CD
CD
CD CD
CD CD
ChangeDetection
Flow
CHANGE DETECTION (onPush)
WITH OBSERVABLES
CD
CD
CD
CD
ChangeDetection
Flow
TYPESCRIPT: A FIRST CLASS CITIZEN
Why typescript
• Angular2 Dependency Injection system is based on
type reflection
• Annotations offer a powerful and very expressive way to
describe elements
Pros
• Improve Developer Experience with better tools
• Compile time error check
• Type safety
• Better documentation
• Easy to adopt for backend developers
Cons
• Increase project’s technical debt
• Slower learning curve for traditional javascript developer
• Impossible to remove without a complete rewrite
THINKING COMPONENTS
Modern web is all about components
• Thinking of components instead of views improves
decoupling and separation of concerns
• Components are composable and highly reusable
• Easier to test
• UX and UI teams integrate better
A component is
• exported as a custom HTML tag: <tab-bar />
• defined by an HTML template
• enhanced using the @component decorator
• controlled using its inputs and outputs
• initialized by Angular Dependency Injection engine
SELECTOR
@COMPONENT
import { Component } from '@angular/core';
@Component({
selector: 'hello',
template: '<p>Hello, {{name}}</p>'
})
export class Hello {
name: string;
constructor() {
this.name = 'World';
}
}
selector is the element property that we use to tell
Angular to create and insert an instance of this
component.
COMPONENT TEMPLATE
@COMPONENT
template is an HTML string that tells Angular what
needs to be to rendered in the DOM.
templateUrl is a relative path to a file containing the
component HTML string.
TEMPLATE SYNTAX
• template tags {{ expression }}: Execute arbitrary
expressions. Eg: {{1+1}.
• property binding [key]=“value”. Used to pass data to a
component.
• event binding (event)=“expression”. Expression
executed anytime the registered event fires.
• 2-way binding <input [(ngModel)]=“u.name"> Requires
to import `FormsModule` to be used.
INPUTS
@COMPONENT
import {Component, Input} from `@angular/
core`;
@Component({
selector: `hello`,
template: `<p>Hello, {{name}}</p>`
})
export class Hello {
@Input() name: string;
}
import { Component } from `@angular/core`;
@Component({
selector: `hello`,
inputs: [`name`],
template: `<p>Hello, {{name}}</p>`
})
export class Hello {}
// To bind to a raw string
<hello name="World"></hello>
// To bind to a variable in the parent scope
<hello [name]="userName"></hello>
OUTPUTS
@COMPONENT
import {Component} from `@angular/core`;
@Component({
selector: `counter`,
template: `
<div>
<p>Count: {{ num }}</p>
<button (click)="increment()">Increment</button>
</div>
`
})
export class Counter {
num: number = 0;
increment() {
this.num++;
}
}
import {
Component, EventEmitter, Output
} from `@angular/core`;
@Component({
selector: `counter`,
template: `
<div>
<p>Count: {{ count }}</p>
<button (click)="increment()">Increment</button>
</div>
`
})
export class Counter {
count: number = 0;
@Output() result: EventEmitter = new EventEmitter();
increment() {
this.result.emit(this.count);
}
}
CHILD COMPONENTS
@COMPONENT
import {Component, ViewChild} from `@angular/
core`;
import {Alert} from `./alert.component`;
@Component({
selector: `app`,
template: `
<my-alert>My alert</my-alert>
<button (click)="showAlert()">Show Alert</
button>`
})
export class App {
@ViewChild(Alert) alert: Alert;
showAlert() {
this.alert.show();
}
}
import {Component, ViewChild} from `@angular/core`;
import {Alert} from `./alert.component`;
@Component({
selector: `app`,
template: `
<my-alert>My alert</my-alert>
<input #msg type=“text” />
<button (click)="showAlert()">Show Alert</button>`
})
export class App {
@ViewChild(Alert) alert: Alert;
@ViewChild(`msg`) msgInput;
showAlert() {
const txt = this.msgInput.nativeElement.value;
this.alert.show(txt);
}
}
CONTENT TRANSCLUSION
@COMPONENT
import {Component, Input} from `@angular/core`;
@Component({
selector: `hello`,
template: `<div>
<p>Hello, {{name}}</p>
<ng-content><p>No extra data</p></ng-content>
</div>`
})
export class Hello {
@Input() name: string;
}
// Usage
<hello name=“Matteo”>
<div>
<h1>Some other data</h1>
<p>Some text</p>
</div>
</hello>
COMPONENT LIFECYCLE
Components & Directives shared lifecycle
ngOnChanges input property value changes
ngOnInit Initialization step
ngDoCheck every change detection cycle
ngOnDestroy before destruction
import {
Component, OnInit
} from '@angular/core';
@Component({
selector: 'hello',
template: '<p>Hello, {{name}}</p>'
})
export class Hello implements OnInit {
name: string;
constructor() {
this.name = 'World';
}
ngOnInit() {
// do something to initialize the component
}
}
import {
Directive, OnInit, OnDestroy
} from '@angular/core';
@Directive({
selector: `[mySpy]`
})
export class SpyDirective implements OnInit, OnDestroy {
constructor(private logger: LoggerService) { }
ngOnInit() {
this.logIt(`onInit`);
}
ngOnDestroy() {
this.logIt(`onDestroy`);
}
private logIt(msg: string) {
this.logger.log(`Spy ${msg}`);
}
}
// Usage
<div mySpy>...</div>
–Angular official docs
“Angular only calls a directive/component hook
method if it is defined.”
COMPONENT STYLE
INLINE STYLES
import { Component } from '@angular/core';
const baseStyle = {
backgroundColor: 'green',
padding: '10px'
};
@Component({
selector: 'hello',
template: ‘<p [ngStyle]="style">Hello!</p>'
})
export class Hello {
style: any = baseStyle;
}
COMPONENT STYLE
VIEW ENCAPSULATION
• Emulated (default) - styles from main HTML propagate to the
component. Styles defined in this component's @Component
decorator are scoped to this component only.
• Native (shadow DOM)- styles from main HTML do not
propagate to the component. Styles defined in this component's
@Component decorator are scoped to this component only.
• None - styles from the component propagate back to the main
HTML and therefore are visible to all components on the page.
———
Be careful with apps that have None and Native components mixed
in the application. All components with None encapsulation will
have their styles duplicated in all components with Native
encapsulation.
import {
Component, ViewEncapsulation
} from '@angular/core';
@Component({
selector: ‘hello',
styles: [`
.main {
background-color: green;
padding: 10px;
}
`],
encapsulation: ViewEncapsulation.Emulated,
template: `<p class="main">Hello!</p>`
})
export class Hello {}
// OUTPUT HTML
<p class="main"
_ngcontent-yok-5=""
>Hello!</p>
// output css (inside <head>)
.main[_ngcontent-yok-5] {
background-color: green;
padding: 10px;
}
BE REACTIVE!
OBSERVE ALL THE THINGS!
–Angular official docs
“Observables open up a continuous channel of
communication in which multiple values of data
can be emitted over time […] Angular 2 uses
observables extensively - you'll see them in the
HTTP service and the event system…”
–A. Staltz
“A stream is a sequence of ongoing events
ordered in time. It can emit 3 different things: a
value, an error, or a "completed" signal.
Consider that the "completed" takes place, for
instance, when the current window is closed.”
OBSERVABLES vs PROMISES
• Both provide us with abstractions that help us deal
with the asynchronous nature of our applications.
• Observables are cancellable.
• Observables can be retried using one of the retry
operators provided by the API, such as retry and
retryWhen.
• Promises require the caller to have access to the
original function that returned the promise in order
to have a retry capability.
import { Observable } from ‘rxjs/Observable';
const dataStream = new Observable((observer) => {
setTimeout(() => {
observer.next(42);
}, 1000);
setTimeout(() => {
observer.next(43);
}, 2000);
setTimeout(() => {
observer.complete();
}, 3000);
});
const subscription = dataStream.subscribe(
(value) => this.values.push(value),
(error) => this.anyErrors = true,
() => this.finished = true
);
import { Component, OnInit, ViewChild } from `@angular/core`;
import { Observable } from 'rxjs';
@Component({
selector: `app`,
template: `<input type="text" #username />`
})
export class App implements OnInit {
@ViewChild(`username`) username: any;
ngOnInit(): void {
Observable
.fromEvent(this.username.nativeElement, 'keyup')
.map((e: any) => e.target.value)
.filter((text: string) => text.length > 5)
.debounceTime(1000)
.subscribe((text: string) => this.submit(text));
}
submit(text: string): void {
console.log('submitted: ', text);
}
}
Bootstrapping Angular
Bootstrapping is an essential process in Angular - it is
where the application is loaded when Angular comes to
life.
Bootstrapping Angular 2 applications is certainly
different from Angular 1.x, but is still a straightforward
procedure.
// app.modules.ts
import { BrowserModule } from '@angular/platform-
browser';
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { AppComponent } from './[PATH]/app.component';
import { MyComponent } from ‘./[PATH]/some.component';
import { SomeService } from “./[PATH]/some.service";
@NgModule({
declarations: [AppComponent, MyComponent],
providers: [SomeService],
imports: [BrowserModule, HttpModule],
bootstrap: [AppComponent]
})
class AppModule {}
// main.ts
import { platformBrowserDynamic } from '@angular/
platform-browser-dynamic';
import { AppModule } from './app/';
// Bootstrap main component
platformBrowserDynamic().bootstrapModule(AppModule);
angular-cli
FAST PROJECT SETUP

WORKING EXAMPLE: github.com/commit-university/exploring-angular-2
THANKS!
@CEF62

More Related Content

PDF
Angular 2 - The Next Framework
PDF
Exploring Angular 2 - Episode 2
PDF
Data Flow Patterns in Angular 2 - Sebastian Müller
PPTX
Angular2 + rxjs
PDF
Introduction to Angular 2
PDF
The productive developer guide to Angular 2
PDF
Exploring Angular 2 - Episode 1
PPTX
Migrating an application from Angular 1 to Angular 2
Angular 2 - The Next Framework
Exploring Angular 2 - Episode 2
Data Flow Patterns in Angular 2 - Sebastian Müller
Angular2 + rxjs
Introduction to Angular 2
The productive developer guide to Angular 2
Exploring Angular 2 - Episode 1
Migrating an application from Angular 1 to Angular 2

What's hot (20)

PDF
An introduction to Angular2
ODP
Introduction to Angular 2
PDF
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
PDF
Angular2 workshop
PDF
Building Universal Applications with Angular 2
PPTX
Angular js 2
PDF
Angular2 with TypeScript
PDF
Angular 2 Essential Training
PDF
Angular 2: core concepts
PPTX
Angular2 for Beginners
PDF
Angular Dependency Injection
PDF
Angular 2 Crash Course
PPTX
2 years of angular: lessons learned
PPTX
Async patterns in javascript
PDF
Tech Webinar: Angular 2, Introduction to a new framework
PPTX
PDF
Angular2 - In Action
PPTX
AngularJS2 / TypeScript / CLI
PPTX
Angular 2 - Better or worse
PPTX
An introduction to Angular2
Introduction to Angular 2
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
Angular2 workshop
Building Universal Applications with Angular 2
Angular js 2
Angular2 with TypeScript
Angular 2 Essential Training
Angular 2: core concepts
Angular2 for Beginners
Angular Dependency Injection
Angular 2 Crash Course
2 years of angular: lessons learned
Async patterns in javascript
Tech Webinar: Angular 2, Introduction to a new framework
Angular2 - In Action
AngularJS2 / TypeScript / CLI
Angular 2 - Better or worse
Ad

Viewers also liked (18)

PDF
(Have a) rest with Laravel
PDF
Commit University - Microsoft Azure
PDF
Getting Started with Angular 2
PDF
Windows Azure Platform
KEY
PHPSpec BDD for PHP
PPTX
Angular 2.0
PPTX
Angular 2 a traveler's diary
PPTX
Brief intro 2 to angular 2
PDF
AzovDevMeetup 2016 | Angular 2: обзор | Александр Шевнин
PPTX
PPT on Angular 2 Development Tutorial
PDF
Introduction to angular 2
PPTX
Angular 2 with typescript
PDF
Get that Corner Office with Angular 2 and Electron
PPTX
An afternoon with angular 2
PPTX
Angular 2
PDF
The evolution of Angular 2 @ AngularJS Munich Meetup #5
PDF
Angular 2 for Java Developers
PPT
Silverlight
(Have a) rest with Laravel
Commit University - Microsoft Azure
Getting Started with Angular 2
Windows Azure Platform
PHPSpec BDD for PHP
Angular 2.0
Angular 2 a traveler's diary
Brief intro 2 to angular 2
AzovDevMeetup 2016 | Angular 2: обзор | Александр Шевнин
PPT on Angular 2 Development Tutorial
Introduction to angular 2
Angular 2 with typescript
Get that Corner Office with Angular 2 and Electron
An afternoon with angular 2
Angular 2
The evolution of Angular 2 @ AngularJS Munich Meetup #5
Angular 2 for Java Developers
Silverlight
Ad

Similar to Commit University - Exploring Angular 2 (20)

PPTX
Introduction to Angular2
PPTX
Angular 2 - a New Hope
PDF
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
PPTX
mean stack
PDF
Meetup SkillValue - Angular 6 : Bien démarrer son application
PPTX
Angular 2 Migration - JHipster Meetup 6
PDF
better-apps-angular-2-day1.pdf and home
PPTX
Angular 2 in-1
PPTX
Building a TV show with Angular, Bootstrap, and Web Services
PDF
[FEConf Korea 2017]Angular 컴포넌트 대화법
PDF
Technozaure - Angular2
PDF
Angular 4 for Java Developers
PDF
Angular 2 - Core Concepts
PPTX
Angular IO
PPTX
Peggy angular 2 in meteor
PDF
Angular 2.0 - What to expect
PPTX
PPTX
Angular1x and Angular 2 for Beginners
PDF
Angular 16 – the rise of Signals
PDF
angular fundamentals.pdf angular fundamentals.pdf
Introduction to Angular2
Angular 2 - a New Hope
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
mean stack
Meetup SkillValue - Angular 6 : Bien démarrer son application
Angular 2 Migration - JHipster Meetup 6
better-apps-angular-2-day1.pdf and home
Angular 2 in-1
Building a TV show with Angular, Bootstrap, and Web Services
[FEConf Korea 2017]Angular 컴포넌트 대화법
Technozaure - Angular2
Angular 4 for Java Developers
Angular 2 - Core Concepts
Angular IO
Peggy angular 2 in meteor
Angular 2.0 - What to expect
Angular1x and Angular 2 for Beginners
Angular 16 – the rise of Signals
angular fundamentals.pdf angular fundamentals.pdf

More from Commit University (20)

PDF
Accessibilità ed equità digitale: un impegno, non una scelta
PDF
GitHub Copilot:vediamo chi comanda - Commit University.pdf
PDF
Contract Driven Development - Branch 2024.pdf
PPTX
Cybersecurity & AI: Illusioni e Speranze
PDF
Migliorare la Developer Experience in un mondo Cloud Native
PPTX
Scopri come sfruttare la potenza della Hybrid RAG
PDF
Introduzione a AWS Forecast e SageMaker DeepAR: Prevedere la Domanda con il M...
PDF
Oltre l'hype: vulnerabilità e limiti dell'intelligenza artificiale.pdf
PPTX
Alla scoperta dei Vector Database e dei RAG
PDF
Nell’iperspazio con Rocket: il Framework Web di Rust!
PDF
Crea il tuo assistente AI con lo Stregatto (open source python framework)
PDF
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
PDF
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
PDF
Slide-10years.pdf
PDF
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
PDF
Vue.js slots.pdf
PPTX
Commit - Qwik il framework che ti stupirà.pptx
PPTX
Sviluppare da zero una Angular Web App per la PA
PDF
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
PDF
Prisma the ORM that node was waiting for
Accessibilità ed equità digitale: un impegno, non una scelta
GitHub Copilot:vediamo chi comanda - Commit University.pdf
Contract Driven Development - Branch 2024.pdf
Cybersecurity & AI: Illusioni e Speranze
Migliorare la Developer Experience in un mondo Cloud Native
Scopri come sfruttare la potenza della Hybrid RAG
Introduzione a AWS Forecast e SageMaker DeepAR: Prevedere la Domanda con il M...
Oltre l'hype: vulnerabilità e limiti dell'intelligenza artificiale.pdf
Alla scoperta dei Vector Database e dei RAG
Nell’iperspazio con Rocket: il Framework Web di Rust!
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
Slide-10years.pdf
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
Vue.js slots.pdf
Commit - Qwik il framework che ti stupirà.pptx
Sviluppare da zero una Angular Web App per la PA
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
Prisma the ORM that node was waiting for

Recently uploaded (20)

PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
How Creative Agencies Leverage Project Management Software.pdf
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PPTX
Transform Your Business with a Software ERP System
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
Become an Agentblazer Champion Challenge Kickoff
PPTX
Materi-Enum-and-Record-Data-Type (1).pptx
PPTX
ISO 45001 Occupational Health and Safety Management System
PDF
System and Network Administraation Chapter 3
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Best Practices for Rolling Out Competency Management Software.pdf
PPTX
ai tools demonstartion for schools and inter college
PDF
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
DOCX
The Five Best AI Cover Tools in 2025.docx
How to Choose the Right IT Partner for Your Business in Malaysia
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
VVF-Customer-Presentation2025-Ver1.9.pptx
Upgrade and Innovation Strategies for SAP ERP Customers
How Creative Agencies Leverage Project Management Software.pdf
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Transform Your Business with a Software ERP System
ManageIQ - Sprint 268 Review - Slide Deck
Softaken Excel to vCard Converter Software.pdf
Which alternative to Crystal Reports is best for small or large businesses.pdf
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Become an Agentblazer Champion Challenge Kickoff
Materi-Enum-and-Record-Data-Type (1).pptx
ISO 45001 Occupational Health and Safety Management System
System and Network Administraation Chapter 3
2025 Textile ERP Trends: SAP, Odoo & Oracle
Best Practices for Rolling Out Competency Management Software.pdf
ai tools demonstartion for schools and inter college
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
The Five Best AI Cover Tools in 2025.docx

Commit University - Exploring Angular 2

  • 2. Angular 2 The Next Framework
  • 3. @cef62 github.com/cef62 Senior frontend engineer @ Staff member of Frontenders Verona Italian React & Angular Communities Maintainer MATTEO RONCHI
  • 4. AngularJS history • AngularJS was originally developed in 2009 by Misko Hevery and Adam Abrons • Misko Hevery started to work for Google in 2009 • 1st release of AngularJS: 1 developer, 3 weeks, 1000 loc • AngularJS version 1.0 was released in 2012 by Google • Angular version 2 was released in September 2016 after 2 years development
  • 5. WELCOME TO THE FUTURE
  • 6. Angular 2 features • Optimized for both desktop and mobile • Ahead of Time (AoT) compilation • Incredible performances • Native Reactive support
  • 8. export class MyService { getData() { return this.loadData.load(); } }
  • 9. import { Injectable } from `angular2/core`; @Injectable() export class MyService { constructor(private loadData:LoadData) {} getData() { return this.loadData.load(); } }
  • 11. import { Component } from '@angular/core'; @Component({ selector: 'hello', template: '<p>Hello, {{name}}</p>' }) export class Hello { name: string; constructor() { this.name = 'World'; } }
  • 13. import { Directive, HostListener } from '@angular/core'; @Directive({ selector: `[confirm]` }) export class ConfirmDirective { @HostListener(`click`, [`$event`]) confirmFirst(event: Event) { return window.confirm( `Are you sure you want to do this?` ); } } // Usage <button type="button" (click)="visitOtherPage()" confirm>Visit another page</button>
  • 15. import { Component } from '@angular/core'; @Component({ selector: `product-price`, template: `<p>Price: {{ price | currency }}</p>` }) export class ProductPrice { price: number = 99.99; }
  • 16. import { Pipe, PipeTransform } from '@angular/core'; const UNITS = ['B', 'KB', 'MB', 'GB']; @Pipe({ name: 'formatFileSize' }) export class FormatSize implements PipeTransform { transform( bytes: number = 0, precision: number = 2 ) : string { if (!isFinite(bytes)) return ‘?'; let unit = 0; while ( bytes >= 1024 ) { bytes /= 1024; unit ++; } return bytes.toFixed(precision) + ' ' + UNITS[unit]; } }
  • 18. import {Injectable} from '@angular/core'; import {Http, Response} from '@angular/http'; import {Observable} from 'rxjs'; import {Hero} from './hero'; @Injectable() export class LoadDataService { constructor(private http: Http) {} search(term: string): Observable<Hero[]> { return this.http .get(`app/heroes/?name=${term}`) .map((r: Response) => { return r.json().data as Hero[] }); } }
  • 20. AngularJS $digest cycle • AngularJS engine is built using a dirty checking algorithm. • Application state is a single entity connected to every visual component and calculated every time a component mutates some data • It’s very easy to trigger unwanted $digest cycles impacting performances • Very difficult to debug
  • 21. Angular 2 Change Detection engine • Based on ngZone • Recalculate the components tree state after every async interaction (events, timers, observables..) • Every component has its own Change Detector • Component’s Change Detector is generated at runtime to improve performances • Developers can control how and when components are recalculated
  • 22. – ngBook2 “When one of the components change, no matter where in the tree it is, a change detection pass is triggered for the whole tree, from top to bottom.”
  • 23. CD CD CD CD CDCD CD CD CHANGE DETECTION TRAVELS TOP TO BOTTOM ChangeDetection Flow
  • 24. CHANGE DETECTION IS DEFINED AT COMPONENT LEVEL
  • 25. • Every component gets a change detector responsible for checking the bindings defined in its template • ChangeDetectionStrategy • default: update the component every time data changes • onPush: update the component only when its inputs change or the component requests to be updated
  • 26. CHANGE DETECTION (onPush) WITH IMMUTABLE DATA CD CD CD CD CD CD ChangeDetection Flow
  • 27. CHANGE DETECTION (onPush) WITH OBSERVABLES CD CD CD CD ChangeDetection Flow
  • 28. TYPESCRIPT: A FIRST CLASS CITIZEN
  • 29. Why typescript • Angular2 Dependency Injection system is based on type reflection • Annotations offer a powerful and very expressive way to describe elements
  • 30. Pros • Improve Developer Experience with better tools • Compile time error check • Type safety • Better documentation • Easy to adopt for backend developers
  • 31. Cons • Increase project’s technical debt • Slower learning curve for traditional javascript developer • Impossible to remove without a complete rewrite
  • 33. Modern web is all about components • Thinking of components instead of views improves decoupling and separation of concerns • Components are composable and highly reusable • Easier to test • UX and UI teams integrate better
  • 34. A component is • exported as a custom HTML tag: <tab-bar /> • defined by an HTML template • enhanced using the @component decorator • controlled using its inputs and outputs • initialized by Angular Dependency Injection engine
  • 36. import { Component } from '@angular/core'; @Component({ selector: 'hello', template: '<p>Hello, {{name}}</p>' }) export class Hello { name: string; constructor() { this.name = 'World'; } }
  • 37. selector is the element property that we use to tell Angular to create and insert an instance of this component.
  • 39. template is an HTML string that tells Angular what needs to be to rendered in the DOM. templateUrl is a relative path to a file containing the component HTML string.
  • 40. TEMPLATE SYNTAX • template tags {{ expression }}: Execute arbitrary expressions. Eg: {{1+1}. • property binding [key]=“value”. Used to pass data to a component. • event binding (event)=“expression”. Expression executed anytime the registered event fires. • 2-way binding <input [(ngModel)]=“u.name"> Requires to import `FormsModule` to be used.
  • 42. import {Component, Input} from `@angular/ core`; @Component({ selector: `hello`, template: `<p>Hello, {{name}}</p>` }) export class Hello { @Input() name: string; }
  • 43. import { Component } from `@angular/core`; @Component({ selector: `hello`, inputs: [`name`], template: `<p>Hello, {{name}}</p>` }) export class Hello {}
  • 44. // To bind to a raw string <hello name="World"></hello> // To bind to a variable in the parent scope <hello [name]="userName"></hello>
  • 46. import {Component} from `@angular/core`; @Component({ selector: `counter`, template: ` <div> <p>Count: {{ num }}</p> <button (click)="increment()">Increment</button> </div> ` }) export class Counter { num: number = 0; increment() { this.num++; } }
  • 47. import { Component, EventEmitter, Output } from `@angular/core`; @Component({ selector: `counter`, template: ` <div> <p>Count: {{ count }}</p> <button (click)="increment()">Increment</button> </div> ` }) export class Counter { count: number = 0; @Output() result: EventEmitter = new EventEmitter(); increment() { this.result.emit(this.count); } }
  • 49. import {Component, ViewChild} from `@angular/ core`; import {Alert} from `./alert.component`; @Component({ selector: `app`, template: ` <my-alert>My alert</my-alert> <button (click)="showAlert()">Show Alert</ button>` }) export class App { @ViewChild(Alert) alert: Alert; showAlert() { this.alert.show(); } }
  • 50. import {Component, ViewChild} from `@angular/core`; import {Alert} from `./alert.component`; @Component({ selector: `app`, template: ` <my-alert>My alert</my-alert> <input #msg type=“text” /> <button (click)="showAlert()">Show Alert</button>` }) export class App { @ViewChild(Alert) alert: Alert; @ViewChild(`msg`) msgInput; showAlert() { const txt = this.msgInput.nativeElement.value; this.alert.show(txt); } }
  • 52. import {Component, Input} from `@angular/core`; @Component({ selector: `hello`, template: `<div> <p>Hello, {{name}}</p> <ng-content><p>No extra data</p></ng-content> </div>` }) export class Hello { @Input() name: string; } // Usage <hello name=“Matteo”> <div> <h1>Some other data</h1> <p>Some text</p> </div> </hello>
  • 54. Components & Directives shared lifecycle ngOnChanges input property value changes ngOnInit Initialization step ngDoCheck every change detection cycle ngOnDestroy before destruction
  • 55. import { Component, OnInit } from '@angular/core'; @Component({ selector: 'hello', template: '<p>Hello, {{name}}</p>' }) export class Hello implements OnInit { name: string; constructor() { this.name = 'World'; } ngOnInit() { // do something to initialize the component } }
  • 56. import { Directive, OnInit, OnDestroy } from '@angular/core'; @Directive({ selector: `[mySpy]` }) export class SpyDirective implements OnInit, OnDestroy { constructor(private logger: LoggerService) { } ngOnInit() { this.logIt(`onInit`); } ngOnDestroy() { this.logIt(`onDestroy`); } private logIt(msg: string) { this.logger.log(`Spy ${msg}`); } } // Usage <div mySpy>...</div>
  • 57. –Angular official docs “Angular only calls a directive/component hook method if it is defined.”
  • 59. import { Component } from '@angular/core'; const baseStyle = { backgroundColor: 'green', padding: '10px' }; @Component({ selector: 'hello', template: ‘<p [ngStyle]="style">Hello!</p>' }) export class Hello { style: any = baseStyle; }
  • 61. • Emulated (default) - styles from main HTML propagate to the component. Styles defined in this component's @Component decorator are scoped to this component only. • Native (shadow DOM)- styles from main HTML do not propagate to the component. Styles defined in this component's @Component decorator are scoped to this component only. • None - styles from the component propagate back to the main HTML and therefore are visible to all components on the page. ——— Be careful with apps that have None and Native components mixed in the application. All components with None encapsulation will have their styles duplicated in all components with Native encapsulation.
  • 62. import { Component, ViewEncapsulation } from '@angular/core'; @Component({ selector: ‘hello', styles: [` .main { background-color: green; padding: 10px; } `], encapsulation: ViewEncapsulation.Emulated, template: `<p class="main">Hello!</p>` }) export class Hello {}
  • 63. // OUTPUT HTML <p class="main" _ngcontent-yok-5="" >Hello!</p> // output css (inside <head>) .main[_ngcontent-yok-5] { background-color: green; padding: 10px; }
  • 65. –Angular official docs “Observables open up a continuous channel of communication in which multiple values of data can be emitted over time […] Angular 2 uses observables extensively - you'll see them in the HTTP service and the event system…”
  • 66. –A. Staltz “A stream is a sequence of ongoing events ordered in time. It can emit 3 different things: a value, an error, or a "completed" signal. Consider that the "completed" takes place, for instance, when the current window is closed.”
  • 68. • Both provide us with abstractions that help us deal with the asynchronous nature of our applications. • Observables are cancellable. • Observables can be retried using one of the retry operators provided by the API, such as retry and retryWhen. • Promises require the caller to have access to the original function that returned the promise in order to have a retry capability.
  • 69. import { Observable } from ‘rxjs/Observable'; const dataStream = new Observable((observer) => { setTimeout(() => { observer.next(42); }, 1000); setTimeout(() => { observer.next(43); }, 2000); setTimeout(() => { observer.complete(); }, 3000); }); const subscription = dataStream.subscribe( (value) => this.values.push(value), (error) => this.anyErrors = true, () => this.finished = true );
  • 70. import { Component, OnInit, ViewChild } from `@angular/core`; import { Observable } from 'rxjs'; @Component({ selector: `app`, template: `<input type="text" #username />` }) export class App implements OnInit { @ViewChild(`username`) username: any; ngOnInit(): void { Observable .fromEvent(this.username.nativeElement, 'keyup') .map((e: any) => e.target.value) .filter((text: string) => text.length > 5) .debounceTime(1000) .subscribe((text: string) => this.submit(text)); } submit(text: string): void { console.log('submitted: ', text); } }
  • 72. Bootstrapping is an essential process in Angular - it is where the application is loaded when Angular comes to life. Bootstrapping Angular 2 applications is certainly different from Angular 1.x, but is still a straightforward procedure.
  • 73. // app.modules.ts import { BrowserModule } from '@angular/platform- browser'; import { NgModule } from '@angular/core'; import { HttpModule } from '@angular/http'; import { AppComponent } from './[PATH]/app.component'; import { MyComponent } from ‘./[PATH]/some.component'; import { SomeService } from “./[PATH]/some.service"; @NgModule({ declarations: [AppComponent, MyComponent], providers: [SomeService], imports: [BrowserModule, HttpModule], bootstrap: [AppComponent] }) class AppModule {}
  • 74. // main.ts import { platformBrowserDynamic } from '@angular/ platform-browser-dynamic'; import { AppModule } from './app/'; // Bootstrap main component platformBrowserDynamic().bootstrapModule(AppModule);
  • 75. angular-cli FAST PROJECT SETUP WORKING EXAMPLE: github.com/commit-university/exploring-angular-2