Angular 2
Lunch & Learn

Vitaly Tkachenko | Jobsity
Angular 2
OVERVIEW

ngular 2: ABOUT

-
Mobile first
-
Modular
-
COMplete rewrite
-
Modern browsers
-
WRITTEN in TYPESCRIPT
ngular 2: LANGUAGES

ES5
ES6
TS
DART
ngular 2: TYPESCRIpt 101

-
CLass (declaration)
class Car {
}
public brand: string;
public number: number;
public isCarNew: boolean;
constructor(brand: string, number: number, isCarNew: boolean){
this.brand = brand;
this.number = number;
this.isCarNew = isCarNew;
}
ngular 2: TYPESCRIpt 101

-
CLass (methods)
class Car {
}
constructor(public brand: string,
public number: number,
public isCarNew: boolean) { }
getCarNumber(): number {
return this.number;
}
setCarNumber(newNumber: number): void {
this.number = newNumber;
}
ngular 2: TYPESCRIpt 101

-
DECORATOR
class FerrariFF {
public model: string = 'FF';
}
function paint(color: string) {
return function(targetClass) {
return class {
model = new targetClass().model;
color = color;
}
}
}
@paint('red')
console.log(new FerrariFF());
// {model: 'FF', color: 'red'}
ngular 2: ARCHITECTURE

App component (cmp)
cmp 1
cmp 2
cmp 3
cmp 4
A tree of components
ngular 2: ARCHITECTURE

component
template
DIREctive
property binding
Event binding
injector
Service
app module
my module
Angular 2
components

ngular 2: COMponents

@Component({
})
export class MyCardComponent {
}
import { Component } from '@angular/core';
selector: 'my-card',
templateUrl: 'my-card.component.html',
styleUrls: ['my-card.component.css']
moduleId: module.id,
ngular 2: Templates

-
interpolation
<p>Hello, my name is {{ user.firstName }}</p>
<p>Hello, my name is {{ getUserFistName() }}</p>
ngular 2: Templates

-
bindings
// one-way binging (data source => view target)
<user-profile [user]="user"></user-profile>
[target]="expression"
// one-way binging (target => data source)
(target)="statement"
<my-card (click)="select()"></my-card>
// two-way binging (data source <=> view target)
[(target)]="expression"
<input type="text" [(ngModel)]="user.firstName">
ngular 2: BUILD-in dirs

-
ngClass
-
ngStyle
-
ngIf
-
ngFor
-
ngSwitch
ngular 2: ngfor

-
ngFor
// notice asterisk (*) symbol
<li *ngFor="let user of users">{{user.fullName}}</li>
<user-profile *ngFor="let user of users" [user]="user">
<user-fullname>{{ user.fullName }}</user-fullname> </user-profile>
ngular 2: ngclass

-
ngClass
// toggle one class
<div [class.cool]="isCool">This div is cool</div>
setClasses() {
let classes = {
bordered: this.isBordered,
blue: this.isBlue
};
return classes;
}
// toggle multiple classes
<div [ngClass]="setClasses()">
This div is bordered and blue
</div>
ngular 2: data flow

-
parent => child
application
users
user
user
cards
[users]="appUsers"
[user]="users"
ngular 2: INPUTS

-
@input
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'user',
templateUrl: 'user.component.html',
styleUrls: ['user.component.css']
})
export class UserComponent {
}
, Input
// user.component.html
<div class="fullName">{{ user.fullName }}</div>
@Input() user;
ngular 2: data flow

-
CHILD => parent
application
users
user
user
cards
(select)="onSelect()"
(select)="onSelect()"
ngular 2: outputs

-
@output
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'user',
templateUrl: 'user.component.html',
styleUrls: ['user.component.css']
})
export class UserComponent {
}
, Output, EventEmitter
// users.component.html
@Output() select = new EventEmitter();
onSelect() { this.select.emit(...); }
<user (select)="onSelected()"></user>
ngular 2: Nested cmps

-
child => parent components
// users.component.html
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'users',
templateUrl: 'users.component.html',
styleUrls: ['users.component.css'],
})
export class UsersComponent {
}
import { UserComponent } from './../user.component';
directives: [UserComponent]
<div>
<user [user]="user"></user>
</div>
deprecated!
ngular 2: CMP lifecycle

-
component lifecycle hooks
- ngOnInit
- ngOnChanges
- ngDoCheck
- ngOnDestroy
ngular 2: oninit

-
ngOnInit
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'my-card',
templateUrl: 'my-card.component.html',
styleUrls: ['my-card.component.css']
})
export class MyCardComponent {
}
, OnInit
implements OnInit
ngOnInit() {
...
}
Angular 2
ngmodules

ngular 2: ngmodules

app module
http module
forms module
Users module
Auth module
ngular 2: ngmodules

-
@ngModule
import { NgModule } from '@angular/core';
@NgModule({
imports: [ ... ], // other modules
declarations: [ ... ], // components, directives, pipes
exports: [ ... ], // components, directives, pipes
providers: [ ... ] // services
})
export class MyModule { }
ngular 2: App module

-
AppModule
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
ngular 2: Custom module

-
UsersModule
@NgModule({
imports: [ HttpModule, FormsModule, AuthModule ],
declarations: [ UserComponent, StatusPipe ],
exports: [ UserComponent ],
providers: [ UserService ]
})
export class UsersModule { }
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { FormsModule } from '@angular/forms';
import { AuthModule } from './../auth/auth.module';
import { UserComponent } from './user.component';
import { UserService } from './user.service';
import { StatusPipe } from './status.pipe';
Angular 2
services & Dependency injection

ngular 2: Services & Di

-
UsersService
import { IUser } from './../users/user';
export class UsersService { getUsers() { ... } updateUser(user: IUser) { ... } }
import { Injectable } from '@angular/core';
@Injectable()
import { AuthService } from './../../auth/auth.service';
constructor(private auth: AuthService) { }
ngular 2: Services & Di

// visible for all components inside this module
import { UserService } from './../users/user.service';
@NgModule({
imports: [ ... ],
declarations: [ ... ],
exports: [ ... ],
providers: [ UserService ]
})
export class UsersModule { }
// visible only for this component and its children
import { UserService } from './../users/user.service';
@Component({
selector: 'my-card',
providers: [ UserService ]
})
export class MyCardComponent { }
ngular 2: Services & Di

-
http service
import { HttpModule } from '@angular/http';
@NgModule({
imports: [ HttpModule ],
declarations: [ ... ],
providers: [ ... ],
bootstrap: [ ... ]
})
export class AppModule { }
ngular 2: Services & Di

-
UsersService
class UsersService {
private usersUrl: string = 'api/v1/users';
constructor(private http: Http) { }
getUsers() {
return this.http.get(this.usersUrl)
.toPromise()
.then(response => response.json().data)
.catch(this.handleError);
}
private handleError(error: any) { ... }
}
import { Http } from '@angular/http';
import 'rxjs/add/operator/toPromise';
ngular 2: Services & Di

-
UsersService
import { Http } from '@angular/http';
import 'rxjs/add/operator/toPromise';
class UsersService {
private usersUrl: string = 'api/v1/users';
constructor(private http: Http) {}
createUsers(user: User) {
return this.http.post(
this.usersUrl,
JSON.stringify(user),
{headers: headers})
.toPromise()
.then(response => response.json().data)
.catch(this.handleError);
}
}
, Headers
let headers = new Headers({'Content-Type': 'application/json'});
Angular 2
DEMO TIME :)

Angular 2
Conclusion

ngular 2: Final notes

- Angular 2 RC5 (RC6) => FINAL!
- angular.io
- Angular Official Style Guide
- Angular Cheat Sheet
- Angular CLI
- Codelyzer
- Material2
- Augury
Thank you!
questions time ;)

jobsity-lunch-and-learn
By m0t0r
jobsity-lunch-and-learn
- 793