All about

Bootstraping app

import {bootstrap} from 'angular2/platform/browser';
import {Component} from 'angular2/core';

@Component({
    selector: 'app',
    template: `
        Hello world!
    `
})
class App {}

bootstrap(App)

Controller & $scope

import {Component} from 'angular2/core';
import {TodoService} from '../services/TodoService';
import {Todo} from '../models/Todo';

@Component({
    selector: 'todo-list',
    template: `
        <ul>
            <li *ngFor="#todo of todos">
                {{todo.title}}
            </li>
        </ul>
    `
})
export class TodoList{
    todos:Array<Todo> = [];
    constructor(public todoService:TodoService) {
        todoService.fetch((todos) => this.todos = todos);
    }
}

R.I.P.

  • angular.module
  • controller
  • $scope
  • DDO
  • Two-way data binding

Share data
between components

export class TodoList {
    @Input() todos:Array<Todo>;
    @Output() onSelectTodo: EventEmitter<Todo> = new EventEmitter();
    select(todo:Todo) {
        this.onSelectTodo.emit(todo);
    }
}

/* another component */

<todo-list [todos]="todos" (onSelectTodo)="selectTodo()">

Angular & WebComponents

@Component({
    selector: 'todo-list',
    template: `
        <style>
            .completed {
                text-decoration: line-through;
            }
        </style>
        <ul>
            <li *ngFor="#todo of todos"
                [ngClass]="{'completed': todo.complete}">
                {{todo.title}}
            </li>
        </ul>
    `
})

Angular & WebComponents

@Component({
    selector: 'todo-list',
    encapsulation: ViewEncapsulation.Emulated, // None, Native
    template: `
        <style>
            .completed {
                text-decoration: line-through;
            }
        </style>
        <ul>
            <li *ngFor="#todo of todos"
                [ngClass]="{'completed': todo.complete}">
                {{todo.title}}
            </li>
        </ul>
    `
})

Template syntax

@Component({
    selector: 'todo-list',
    template: `
        <ul>
            <li (click)="toggle(todo, $event)"
                [hidden]="todo.complete"
                *ngFor="#todo of todos">
                {{todo.title}}
            </li>
        </ul>
        <input #myInput>
        {{myInput.value}}
    `
})

Router

/* app routing */
@RouteConfig([
    { path: '/', name: 'Home', component: HomeComponent},
    { path: '/todos/...', name: 'Todos', component: TodosComponent}
])

/* * * * * * * * * * * * * * * * * * * * */
/* TodosComponent */

@RouteConfig([
    { path: '/:id', name: 'Todo', component: TodoComponent}
])

Modularity and DI

/* create srervice */
@Injectable()
export class TodoService {}

/* bootstraping */
bootstrap(App, [TodoService]);

/* Todos component */
import {TodoService} from '../services/TodoService';

class Todos {
    constructor(public todoService:TodoServive) 
        this.todoService.fetch();
    }
}

Modularity and DI

/* create srervice */
@Injectable()
export class TodoService {}

/* bootstraping */
bootstrap(App, [
    provide('TodoService', {useClass: TodoService})
]);

/* Todos component */
import {TodoService} from '../services/TodoService';

class Todos {
    constructor(@Inject('TodoService') public todoService) 
        this.todoService.fetch();
    }
}

Why

  • performance
  • component based UI
  • unidirectional data flow
  • web components
  • ​mobile apps

Static typing

export class TodoList {
    todo:Array<Todo>;

    toggle(todo:Todo) {
        todo.toggle();
    }

    selectTodo(todo:Todo):Todo {
        return todo;
    }
}

Static typing

export class TodoList {
    todo:Array<Todo>;

    methodWithCallback(callback:(Array<Todos>) => any) {
        callback(this.todos);
    }
}

Anotations

@Component({
    selector: 'todo-list',
    template: `
        todos'll be here
    `
})

export class TodoList {}

Interface

interface User {
    id:number;
    name:string;
    age?:number;
}

Modules

module UserNamespace {
 
    export interface IUser {
        id:number;
        name:string;
        age?:number;
    }
 
    export class User implements IUser {
        private _id: number;
        private _name: string;
        constructor(id: number, name: string) {
            this._id = id;
            this._name = name;
        }
    }
     
    var defaultUser: IUser = new User(2, "Tom");
}

Access modifiers

export class User implements IUser {
    private _id: number;
    private _name: string;
    constructor(id: number, name: string) {
        this._id = id;
        this._name = name;
    }
}
import {bootstrap} from "angular2/platform/browser";
import {Component} from "angular2/core";

@Component({
    selector: 'app',
    template: `
        Thnx you all for your attention!
    `
})
class App {}

bootstrap(App);

All about Angular2 & TypeScript

By Anton Shyrokoborodov

All about Angular2 & TypeScript

  • 1,026