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