Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[Gerard Sans] New Data Architecture in Angular 2
Search
Google Developers Group Lviv
September 10, 2016
Technology
0
160
[Gerard Sans] New Data Architecture in Angular 2
Presentation from GDG DevFest Ukraine 2016.
Learn more at:
https://devfest.gdg.org.ua
Google Developers Group Lviv
September 10, 2016
Tweet
Share
More Decks by Google Developers Group Lviv
See All by Google Developers Group Lviv
[Elad Bezalel] Angular Material CDK
gdglviv
1
160
[Zac Sweers] Breaking the Android ClassLoader
gdglviv
1
240
[Daniel Galpin] Adventures in Navigation
gdglviv
2
500
[Rebecca Franks] Practical Image Processing in Android
gdglviv
1
390
[Mateusz Herych] Architecture for App Bundles
gdglviv
2
130
[Andrea Falcone] Iterative Mobile Development
gdglviv
2
100
[Yonatan Levin] Keynote: The world of change and your significance in it
gdglviv
1
140
[Denys Tkalich] Using BigQuery as a data warehouse in B2B startup
gdglviv
1
97
[Mete Atamel] Google Assistant powered by Containers, Machine Learning and .NET on Google Cloud
gdglviv
1
150
Other Decks in Technology
See All in Technology
なぜSaaSがMCPサーバーをサービス提供するのか?
sansantech
PRO
8
2.8k
allow_retry と Arel.sql / allow_retry and Arel.sql
euglena1215
1
160
Android Audio: Beyond Winning On It
atsushieno
0
100
KotlinConf 2025_イベントレポート
sony
1
120
COVESA VSSによる車両データモデルの標準化とAWS IoT FleetWiseの活用
osawa
1
270
なぜテストマネージャの視点が 必要なのか? 〜 一歩先へ進むために 〜
moritamasami
0
210
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
180
Codeful Serverless / 一人運用でもやり抜く力
_kensh
7
390
Snowflakeの生成AI機能を活用したデータ分析アプリの作成 〜Cortex AnalystとCortex Searchの活用とStreamlitアプリでの利用〜
nayuts
1
470
ハードウェアとソフトウェアをつなぐ全てを内製している企業の E2E テストの作り方 / How to create E2E tests for a company that builds everything connecting hardware and software in-house
bitkey
PRO
1
120
MCPで変わる Amebaデザインシステム「Spindle」の開発
spindle
PRO
3
3.2k
La gouvernance territoriale des données grâce à la plateforme Terreze
bluehats
0
150
Featured
See All Featured
Practical Orchestrator
shlominoach
190
11k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
Documentation Writing (for coders)
carmenintech
74
5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Bash Introduction
62gerente
615
210k
Making Projects Easy
brettharned
117
6.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Gamification - CAS2011
davidbonilla
81
5.4k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Transcript
New Data Architecture in Angular 2 by Gerard Sans |
@gerardsans
A little about me
a bit more...
- 27-28th Sept AngularConnect @AngularConnect
Angular 2
None
Features Latest Web Standards Simple Lightning fast Works everywhere
builtwithangular2.com
ES5, ES6 and TypeScript
ES5 / ES6 / TypeScript ES6 (ES2015) Classes, modules, arrow
functions TypeScript Types, annotations, generics, interfaces Great editor support
Angular 2 Tooling
Angular 2 Tooling
Bootstrapping
Bootstrapping Angular Application instantiation Root Module (AppModule) Global Dependencies Router,
Http, Services Global Values Vendor dependencies
index.html <!DOCTYPE html> <html> <head> <!-- Polyfill(s) for older browsers
--> <script src="https://unpkg.com/core-js/client/shim.min.js"></script> <script src="https://unpkg.com/
[email protected]
?main=browser"></script> <script src="https://unpkg.com/
[email protected]
"></script> <script src="https://unpkg.com/
[email protected]
/dist/system.src.js">< <script src="systemjs.config.js"></script> <script>System.import('app');</script> </head> <body> <my-app> Loading... </my-app> </body> </html>
main.ts import {platformBrowserDynamic} from '@angular/platform-browser-dyn import {AppModule} from './app'; platformBrowserDynamic().bootstrapModule(AppModule)
app.module.ts import { NgModule } from '@angular/core'; import { BrowserModule
} from '@angular/platform-browser'; import { App } from './app.component'; @NgModule({ imports: [ BrowserModule ], declarations: [ App ], bootstrap: [ App ] }) export class AppModule {}
app.component.ts import { Component } from '@angular/core'; @Component({ selector: 'my-app',
// <my-app>Loading...</my-app> template: `...` }) export class App { constructor() { } }
Components
Components Tree source: blog
Component @Component annotation Communications Inputs, @Input Outputs, @Output Component Lifecycle
Hooks Host element interaction
Component import { Component } from '@angular/core'; @Component({ selector: 'home',
// <home></home> styles: [`h1 { color: red }`], template: `<h1>Home</h1>` }) export class Home { ... }
Lifecycle Hooks import { Component, OnChanges, OnInit, OnDestroy } from
'@angular/c @Component() export class myComponent implements OnChanges, OnInit, OnDestroy { /* 1 */ constructor() { } // called when an input or output binding changes /* 2 */ ngOnChanges(changes) { } // after child initialisation /* 3 */ ngOnInit() { } // just before is destroyed /* 4 */ ngOnDestroy() { } }
None
Templating
Template Syntax Syntax Binding type <h1>{{title}}</h1> <input [value]="firstName"> <li [class.active]="isActive"></li>
<div [style.width.px]="mySize"> Interpolation Property Class Style <button (click)="onClick($event)"> Event [(ngModel)]="data.value" Two-way
Reactive Extensions
RxJS 5
3 2 1 Stream
//Observable constructor let simple$ = Rx.Observable.create(observer => { try {
//pushing values observer.next(1); observer.next(2); observer.next(3); //complete stream observer.complete(); } catch(e) { //error handling observer.error(e); } }); Observable
Subscribe /* a$ ---1---2---3| */ let a$ = Rx.Observable.of(1,2,3); let
subscription = a$.subscribe({ next: x => console.log(x), error: x => console.log('#'), complete: () => console.log('|') });
Unsubscribe let subscription = twits$.subscribe( twit => feed.push(twit), error =>
console.log(error), () => console.log('done') ); setTimeout(() => subscription.unsubscribe(), 5000);
Example Rx.Observable.of(1) .subscribe({ next: x => console.log(x), complete: () =>
console.log('3') }); console.log('2'); // a) 1 2 3 // b) 2 1 3 // c) 1 3 2 // d) 3 2 1
None
Schedulers Observable.of(1) .subscribeOn(Rx.Scheduler.async) .subscribe({ next: (x) => console.log(x), complete: ()
=> console.log('3') }); console.log('2'); // a) 1 2 3 // b) 2 1 3 // c) 1 3 2 // d) 3 2 1
Why Observables? Flexible: sync or async Powerful operators Less code
RxJS 5 in Angular2 Asynchronous processing Http Forms: controls, validation
Component events EventEmitter
Http Module
Main Features Primary protocol for client/server communications Implements XMLHttpRequest (XHR)
and JSONP Http methods: GET, POST, PUT, DELETE, PATCH and HEAD
Creating a Http Service // app.module.ts import { HttpModule }
from '@angular/http'; @NgModule({ imports: [HttpModule], ... }) export class AppModule {}
Creating a Http Service // usersService.ts import { Injectable }
from '@angular/core'; import { Http } from '@angular/http'; @Injectable() export class UsersService { constructor(private http: Http) { } get() { return this.http.get('/assets/users.json') .map(response => response.json().users) .retryWhen(errors => errors.delay(2000)); } }
Consuming a Http Service import { Component } from '@angular/core';
import { UsersService } from '../services/usersService'; @Component({ selector: 'users', template: `<h1>Users</h1> <tr *ngFor="let user of userslist | async"> <td>{{user.username}}</td> </tr>` }) export class Users { private userslist; constructor(users: UsersService) { this.userslist = users.get(); } }
Data Architecture
Unidirectional Data Flow source: blog
Overview Data Services Components State Management (Redux) (RxJS 5) ng2-redux
ngrx/store GraphQL/Apollo Client
Дякую Thanks