Transcript
Page 1: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

ANGULAR 2.0

CTO, Rangle.io

Yuri Takhteyev

Some rights reserved - Creative Commons 2.0 by-sa

SURVIVE THE TRANSITION

Page 2: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

What’s Angular 2, Anyway?

Page 3: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

• A new front end framework inspired by Angular 1.x.

• And by other things also.

• Now in “alpha”.

What is Angular 2?

Image by mtaphotos

Page 4: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

The Context• Angular 1.x and it’s challenges.

• Components: Web components, React JS.

• Reactive programming: ReactJS, Flux, FRP.

• ES6 classes + annotations.

• Strong typing: TypeScript, Flow.

• ES6 modules.

Page 5: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

View Binding

Page 6: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

What Angular 1.x Gave Us• A view binding system.

• Modules with DI.

• Utilities.

Page 7: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Angular 1’s View Binding• Declarative.

• Separation between templates and code.

• Two-way data binding.

• Stateful.

• Using nested $scopes.

Page 8: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Alternative: Components• ReactJS.

• Web components.

• Doable with “controller as” and isolated directives.

• Business logic goes into services.

Page 9: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Alternative: Unidirectional Flow• ReactJS: better performance, procedural, merges HTML and code.

• Flux: easier to reason about complex data flow.

• Key idea: events instead of state.

• Perhaps even better: FRP.

Page 10: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

What Angular 2 Promises• Still very declarative.

• 3 types of directives: components, decorators, templates.

• Better support for unidirectional data flow.

• Three models: stateful, reactive, immutable.

• Componentized: no more $digest cycle.

• Controllers folded into components.

Page 11: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

An Angular 2 Template

<foo [bar]="x+1" (baz)="doSomething()"> Hello.</foo>

Page 12: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Angular 2 Template

<button [disabled]="!inputIsValid" (click)="authenticate()"> Login</foo>

Page 13: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Angular 2 Template

<amazing-chart [series]="mySeries" (drag)="handleDrag()"/>

Page 14: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Classes + Decorators

Page 15: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

ES6 Classes

class Widget { name; constructor() { name = 'No name'; } setName(newName) { name = newName; } getName() { return name; }} � Those are “maximally minimal classes”.

Page 16: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Classes in Angular 2• Components are classes (a bit like “controller as”).

• Services are classes.

Page 17: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Component as a Class

class LoginFormComponent { constructor() { }

validate(field, value) { this[field] = value; this.inputIsValid = (!!this.username && !!this.password); }

authenticate(username, password) { // tbd }}

Page 18: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Component Template

Enter username:<input #username name="username" (keyup)="validate('username', username.value)"><br>

Password:<input #password type="password" name="password" (keyup)="validate('password', password.value)"><br>

<button id="login-button" (click)="authenticate" [disabled]="!!inputIsValid">Login</button>

Page 19: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Decorators in ES5

LoginFormComponent.annotate = [ new Component({ selector: 'acme-login-form' }), new View({ templateUrl: 'authenticate.html', })];

Page 20: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

In AtScript / TypeScript / ES7*

@Component({ selector: 'acme-login-form'})@View({ templateUrl: 'authenticate.html',})class LoginFormComponent { ...}

Page 21: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

TypeScript

Page 22: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Types

class LoginFormComponent { name: string; inputIsValid: boolean; username: string; password: string; ...

validate(field:string, value:string) { ... }

� A bit closer to real classes.

Page 23: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Types and DI

constructor(someService: SomeService) { ...}

Page 24: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

@Injectable

@Injectableclass SomeService { name; constructor() {} setName(newName) { this.name = newName; } getName() { return this.name; }}

Page 25: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Modules

Page 26: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Angular 1.x• ES5 has no modules.

• Angular 1’s modules do not provide much isolation.

• Alternative: CommonJS (easy but synchronous only).

• Alternative: AMD (asynchronous but complicated).

• Neither really solves Angular 1’s module problem.

Page 27: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Going Forward• ES6 introduces the concept of module.

• Easy.

• Asynchronous when you want it to be.

• Angular 2 is leveraging it.

• Use SystemJS to load ES6 modules today.

• TypeScript introduces a few quirks.

Page 28: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Using ES6 Modules

import {Injectable} from 'angular2/di';import {Component, View} from ‘angular2/angular2';...export {SomeService, SomeOtherService};

Page 29: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Trying Angular 2

Page 30: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Playground Projects• https://github.com/SekibOmazic/angular2-playground (elaborate, but uses Traceur)

• https://github.com/angular/ts-quickstart (uses TypeScript, but very bare)

Page 31: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Docs• https://angular.io/ (not much there yet)

• https://www.youtube.com/user/ngconfvideos

• https://angularu.com/ng/session

• http://bit.ly/ngdocs (design docs, go here to deep-dive)

Page 32: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

But What Do We Do Now?

Page 33: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Get Started on ES6 or TypeScript• Babel or Traceur are easiest to get started with.

• TypeScript is what you’ll probably end up using eventually.

• ES5 ⊆ ES6, so your code is already ES6.

• Write your controllers and services as ES6 classes.

Page 34: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

ES5 Controller

angular.module('myapp') .controller(['authService', function(authService) { var vm = this; vm.authenticate = function(username, password) { authService.authenticate(username, password) .then(function() { // do something }); }; }]);

Page 35: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

ES6 Controller

angular.module('myapp') .controller(['authService', class LoginFormComponent { constructor(authService) { this.authService = authService; } authenticate(username, password) { this.authService.authenticate(username, password) .then(() => /* do something */); } }]);

� Learn about arrow functions (and “this”).

Page 36: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Consider Modules Too

export class LoginFormComponent { constructor(authService) { this.authService = authService; } authenticate(username, password) { this.authService.authenticate(username, password) .then(() => /* do something */); }}

Page 37: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Importing

import {LoginFormComponent} from 'some/path';

angular.module('myapp') .controller(['authService', LoginFormComponent]);

Page 38: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Modules vs Injected Services• Not everything needs to be a service. Some code can be just imported.

• Services are singletons.

• Services are stateful. (Not always a good thing.)

• Services are configurable. (Often useful.)

Page 39: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Your Tooling May Need to Change• Gulp is still the tool of choice.

• Just serving a folder won’t do it.

• Concatenating transpiled modules is a bit of a pain.

• JSPM is probably the way to go. The next version of TypeScript should make things easier.

• We’ll have a blog post on all of this soon.

� http://blog.rangle.io/

Page 40: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Unit Testing• A topic strangely missing from Angular 2 discussion.

• You want to make sure you can migrate your tests too!

• But even getting tests to run at all is a bit of an adventure.

• But we’ll have a blog post on this soon!

Page 41: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Decorator Libraries• Libraries can give you @Component, @View, etc.

• But why? Just so that your code looks like Angular 2?

• More important to focus on architectural alignment.

• We are using our own implementation of @Inject, but generate components with makeComponent().

Page 42: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Organize Your Code as Components

Image by the Angular team.

Page 43: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Linking Components• “Minion” components: not aware of your app.

• “Master” components: hook into the rest of your app.

• “Leutenant” components: in between.

Page 44: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

“Minion” Component

Parent

Child

PropertyChanges Events

� Maximize your use of “minions”.

PropertyChanges

Page 45: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

“Master” Components

Component

� Use “master” components sparingly.

Update events

Action events Services

Services

Page 46: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

“Leutenant" Component

Parent

Child

PropertyChanges

Action events

Page 47: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Flux Architecture

Component

Dispatcher

Action

Store

API, etc.

Component

Page 48: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Writing Components Today• Use isolated directives with “Controller as”

• If your controller is written as an ES6 class, you are getting close to Angular 2 controllers.

Page 49: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

ES5 “Controller As” Directive

.directive('acme-user', function () { return { restrict: 'E', scope: { nextName: '@' }, bindToController: true, template: ‘...', controllerAs: ‘vm', controller: function() { var vm = this; vm.name = 'Alice'; vm.change = function() { vm.name = vm.nextName; } } };});

Page 50: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

ES5 “Controller As” Directive

controller: function() { var vm = this; vm.name = 'Alice'; vm.change = function() { vm.name = vm.nextName; }},

Page 51: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

ES6

controller: class AcmeUserComponent { constructor() { this.name = 'Alice'; } change() { this.name = this.nextName; }}

Page 52: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Implementing Flux Streams• RxJS or Bacon.JS

• ImmutableJS.

• In Angular 2, use of reactive / immutable architecture will also speed things up.

Page 53: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Learning More• Our blog: http://blog.rangle.io/

• Rangle.io Angular Transition Training: 2 or 5 days. http://rangle.io/javascript-training.html

Page 54: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

Kudos• This has been a group effort.

• Special thanks to Igor Krivanov, Varun Vachhar, Cosmin Bucur, Christine Davis, Brian Olynyk, Evan Schultz, Neil Fenton, Bertrand Karerangabo.

Page 55: Angular 2 webinar: The tools you need to convert to Angular 2.0 with Yuri Takhteyev

THANK YOU!

Yuri Takhteyev

@rangleio, @qaramazov

rangle, yuri

CTO, Rangle.io

http://blog.rangle.io/