SlideShare uma empresa Scribd logo
1 de 126
Baixar para ler offline
Паразитируем на
React-экосистеме
(Angular 4+)
Алексей Охрименко (IPONWEB)
#ritfest2017
Алексей
Охрименко
Tweeter: @Ai_boy
Gitter: aiboy
IPONWEB
4.x
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'project-name-app',
template: `
<h1 (click)='onClick()'>
{{title}}
</h1>
`,
styleUrls: ['project-name.component.css']
})
export class PROJECTNAMEAppComponent {
title = 'project-name works!';
}
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'project-name-app',
template: `
<h1 (click)='onClick()'>
{{title}}
</h1>
`,
styleUrls: ['project-name.component.css']
})
export class PROJECTNAMEAppComponent {
title = 'project-name works!';
}
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'project-name-app',
template: `
<h1 (click)='onClick()'>
{{title}}
</h1>
`,
styleUrls: ['project-name.component.css']
})
export class PROJECTNAMEAppComponent {
title = 'project-name works!';
}
Терминология
Терминология
Паразит Паразитоид
Паразитизм
• форма взаимоотношений между организмами различных
видов, из которых один (паразит — aka Angular 4+)
использует другого (хозяина — aka React) в качестве среды
обитания и источника питания, нанося ему вред, но при
этом не убивая.
Паразитоид
• организм, который проводит значительную часть своей
жизни (в личиночной стадии), проживая на или внутри
своего единственного хозяина, которого он постепенно
убивает в процессе.
Паразитоид
• организм, который проводит значительную часть своей
жизни (в личиночной стадии), проживая на или внутри
своего единственного хозяина, которого он постепенно
убивает в процессе.
Patient zero
+ + + + + + + + + +
• RxJs -> Observable
+ + + + + + + + + +
• RxJs -> Observable
• поддержка Immutable структур данных
+ + + + + + + + + +
• RxJs -> Observable
• поддержка Immutable структур данных
• Denendency Injection
+ + + + + + + + + +
• RxJs -> Observable
• поддержка Immutable структур данных
• Denendency Injection
• нет необходимости ничего Angular-ифаить, оборачивать и
адаптировать
+ + + + + + + + + +
• RxJs -> Observable
• поддержка Immutable структур данных
• Denendency Injection
• нет необходимости ничего Angular-ифаить, оборачивать и
адаптировать
• Многопоточность с WebWorkers
Массовое заражение
Telegram
https://t.me/angular_ru
768
Паразитизм
Подходы
React
Component
Подходы
React
Component
Renderer
Подходы
React Angular
Component Component
Renderer
Подходы
React Angular
Component
Module
Component
Renderer
Подходы
React Angular
Component
Module
Component
Platform
Renderer
Подходы
React Angular
Component
Module
Component
Platform
Renderer
Module
Comp
SSR (Universal App) - EASY MODE
https://github.com/angular/angular-cli
https://github.com/evertonrobertoauler/cli-
universal-demo
Подходы
Декларативный Императивный
React.createElement(‘div’, [
React.createElement(‘span’)
])
let div = Renderer2.createElement(‘div’)
let span = Renderer2.createElement(‘span’)
Renderer2.appendChild(div, span)
Коммуникация между компонентами
React Angular
Components Props and Events Components Props and Events
Services
Коммуникация между компонентами
React Angular
Components Props and Events Components Props and Events
Services
Коммуникация между компонентами
ROOT
TARGET
Components Props
Коммуникация между компонентами
ROOT
TARGET
Components Props
Коммуникация между компонентами
ROOT
TARGET
Components Props
Коммуникация между компонентами
ROOT
TARGET
Components Props
Коммуникация между компонентами
ROOT
TARGET
Services
SERVICE
Коммуникация между компонентами
ROOT
TARGET
Services
SERVICE
Коммуникация между компонентами
ROOT
TARGET
Services
SERVICE
Коммуникация между компонентами
ROOT
TARGET
Services
SERVICE
Коммуникация между компонентами
ROOT
TARGET
Redux, Mobx
SERVICE
Идеи
Идеи
https://github.com/roman01la/html-to-react-components
https://github.com/poetic/reacterminator
Идеи
create-angular-components
CLI
npm install -g create-react-app
create-react-app PROJECT-NAME
cd PROJECT-NAME/
npm start
npm install -g @angular/cli
ng new PROJECT-NAME
cd PROJECT-NAME/
ng serve
Angular/CLI - Scaffolding
Component
ng g component my-new-
component
Directive
ng g directive my-new-
directive
Pipe
ng g pipe my-new-pipe
Service
ng g service my-new-
service
Class
ng g class my-new-class
Guard
ng g guard my-new-guard
Interface
ng g interface my-new-
interface
Enum
ng g enum my-new-enum
Module
ng g module my-module
Redux
https://github.com/angular-redux/store
https://github.com/angular-redux/example-app
https://github.com/ngrx/store
Redux
Angular Redux + Redux Observable
Redux
import {
applyMiddleware,
Store,
combineReducers,
compose,
createStore
} from 'redux';
import { NgReduxModule, NgRedux } from '@angular-redux/store';
import { createLogger } from 'redux-logger';
import { rootReducer } from './reducers';
Redux
import {
applyMiddleware,
Store,
combineReducers,
compose,
createStore
} from 'redux';
import { NgReduxModule, NgRedux } from '@angular-redux/store';
import { createLogger } from 'redux-logger';
import { rootReducer } from './reducers';
Redux
import {
applyMiddleware,
Store,
combineReducers,
compose,
createStore
} from 'redux';
import { NgReduxModule, NgRedux } from '@angular-redux/store';
import { createLogger } from 'redux-logger';
import { rootReducer } from './reducers';
Redux
import {
applyMiddleware,
Store,
combineReducers,
compose,
createStore
} from 'redux';
import { NgReduxModule, NgRedux } from '@angular-redux/store';
import { createLogger } from 'redux-logger';
import { rootReducer } from './reducers';
Redux
interface IAppState { /* ... */ };
export const store: Store<IAppState> = createStore(
rootReducer,
applyMiddleware(createLogger())
);
Redux
interface IAppState { /* ... */ };
export const store: Store<IAppState> = createStore(
rootReducer,
applyMiddleware(createLogger())
);
Redux
interface IAppState { /* ... */ };
export const store: Store<IAppState> = createStore(
rootReducer,
applyMiddleware(createLogger())
);
Redux
@NgModule({
/* ... */
imports: [ /* ... */, NgReduxModule ]
})
class AppModule {
constructor(ngRedux: NgRedux<IAppState>) {
ngRedux.provideStore(store);
}
}
Redux
@NgModule({
/* ... */
imports: [ /* ... */, NgReduxModule ]
})
class AppModule {
constructor(ngRedux: NgRedux<IAppState>) {
ngRedux.provideStore(store);
}
}
Redux
import { select } from '@angular-redux/store';
@Component({
template: '<button (click)="onClick()">Clicked {{ count | async }} times</button>'
})
class App {
@select() count$: Observable<number>;
constructor(private ngRedux: NgRedux<IAppState>) {}
onClick() {
this.ngRedux.dispatch({ type: INCREMENT });
}
}
Redux
import { select } from '@angular-redux/store';
@Component({
template: '<button (click)="onClick()">Clicked {{ count | async }} times</button>'
})
class App {
@select() count$: Observable<number>;
constructor(private ngRedux: NgRedux<IAppState>) {}
onClick() {
this.ngRedux.dispatch({ type: INCREMENT });
}
}
Redux
import { select } from '@angular-redux/store';
@Component({
template: '<button (click)="onClick()">Clicked {{ count | async }} times</button>'
})
class App {
@select() count$: Observable<number>;
constructor(private ngRedux: NgRedux<IAppState>) {}
onClick() {
this.ngRedux.dispatch({ type: INCREMENT });
}
}
Redux
import { select } from '@angular-redux/store';
@Component({
template: '<button (click)="onClick()">Clicked {{ count | async }} times</button>'
})
class App {
@select() count$: Observable<number>;
constructor(private ngRedux: NgRedux<IAppState>) {}
onClick() {
this.ngRedux.dispatch({ type: INCREMENT });
}
}
Redux
import { select } from '@angular-redux/store';
@Component({
template: '<button (click)="onClick()">Clicked {{ count | async }} times</button>'
})
class App {
@select() count$: Observable<number>;
constructor(private ngRedux: NgRedux<IAppState>) {}
onClick() {
this.ngRedux.dispatch({ type: INCREMENT });
}
}
Mobx
https://github.com/mobxjs/mobx-angular
Mobx
import { MobxAngularModule } from 'mobx-angular';
@NgModule({
imports: [..., MobxAngularModule]
})
export class MyModule {}
Mobx
import { MobxAngularModule } from 'mobx-angular';
@NgModule({
imports: [..., MobxAngularModule]
})
export class MyModule {}
Mobx
import { MobxAngularModule } from 'mobx-angular';
@NgModule({
imports: [..., MobxAngularModule]
})
export class MyModule {}
Mobx
import {store} from './store/counter';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *mobxAutorun>
{{ store.value }} - {{ store.computedValue }}
<button (click)="store.action">Action</button>
</div>
`
})
export class AppComponent {
store = store;
}
Mobx
import {store} from './store/counter';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *mobxAutorun>
{{ store.value }} - {{ store.computedValue }}
<button (click)="store.action">Action</button>
</div>
`
})
export class AppComponent {
store = store;
}
Mobx
import {store} from './store/counter';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *mobxAutorun>
{{ store.value }} - {{ store.computedValue }}
<button (click)="store.action">Action</button>
</div>
`
})
export class AppComponent {
store = store;
}
Mobx
import {store} from './store/counter';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *mobxAutorun>
{{ store.value }} - {{ store.computedValue }}
<button (click)="store.action">Action</button>
</div>
`
})
export class AppComponent {
store = store;
}
Mobx
import {store} from './store/counter';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *mobxAutorun>
{{ store.value }} - {{ store.computedValue }}
<button (click)="store.action">Action</button>
</div>
`
})
export class AppComponent {
store = store;
}
Mobx
import {store} from './store/counter';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *mobxAutorun>
{{ store.value }} - {{ store.computedValue }}
<button (click)="store.action">Action</button>
</div>
`
})
export class AppComponent {
store = store;
}
Mobx
import {store} from './store/counter';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *mobxAutorun>
{{ store.value }} - {{ store.computedValue }}
<button (click)="store.action">Action</button>
</div>
`
})
export class AppComponent {
store = store;
}
GraphQL
https://www.apollodata.com/
GraphQL
https://www.apollodata.com/
Relay
GraphQL
https://www.apollodata.com/
Relay
GraphQL
https://www.apollodata.com/
GraphQL
import { ApolloClient } from 'apollo-client';
import { ApolloModule } from 'apollo-angular';
GraphQL
import { ApolloClient } from 'apollo-client';
import { ApolloModule } from 'apollo-angular';
const client = new ApolloClient();
export function provideClient(): ApolloClient {
return client;
}
GraphQL
import { ApolloClient } from 'apollo-client';
import { ApolloModule } from 'apollo-angular';
const client = new ApolloClient();
export function provideClient(): ApolloClient {
return client;
}
GraphQL
import { ApolloClient } from 'apollo-client';
import { ApolloModule } from 'apollo-angular';
const client = new ApolloClient();
export function provideClient(): ApolloClient {
return client;
}
GraphQL
@NgModule({
imports: [
BrowserModule,
ApolloModule.forRoot(provideClient)
],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
class AppModule {}
GraphQL
@NgModule({
imports: [
BrowserModule,
ApolloModule.forRoot(provideClient)
],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
class AppModule {}
GraphQL
import { Component, OnInit } from '@angular/core';
import { Apollo } from 'apollo-angular';
import gql from 'graphql-tag';
GraphQL
// We use the gql tag to parse our query string into a query
document
const CurrentUserForProfile = gql`
query CurrentUserForProfile {
currentUser {
login
avatar_url
}
}
`;
GraphQL
@Component({ ... })
class ProfileComponent implements OnInit {
constructor(private apollo: Apollo) {}
ngOnInit() {
this.apollo.watchQuery<QueryResponse>({
query: CurrentUserForProfile
}).subscribe(({data}) => {
this.loading = data.loading;
this.currentUser = data.currentUser;
});
}
}
GraphQL
@Component({ ... })
class ProfileComponent implements OnInit {
constructor(private apollo: Apollo) {}
ngOnInit() {
this.apollo.watchQuery<QueryResponse>({
query: CurrentUserForProfile
}).subscribe(({data}) => {
this.loading = data.loading;
this.currentUser = data.currentUser;
});
}
}
GraphQL
@Component({ ... })
class ProfileComponent implements OnInit {
constructor(private apollo: Apollo) {}
ngOnInit() {
this.apollo.watchQuery<QueryResponse>({
query: CurrentUserForProfile
}).subscribe(({data}) => {
this.loading = data.loading;
this.currentUser = data.currentUser;
});
}
}
GraphQL
@Component({ ... })
class ProfileComponent implements OnInit {
constructor(private apollo: Apollo) {}
ngOnInit() {
this.apollo.watchQuery<QueryResponse>({
query: CurrentUserForProfile
}).subscribe(({data}) => {
this.loading = data.loading;
this.currentUser = data.currentUser;
});
}
}
Паразитоид
Быстрая смерть
create-angular-components
Долгая и мучительная
Article List
<div>
{
props.articles.map(article => {
return (
<ArticlePreview article={article} key={article.slug} />
);
})
}
</div>
Способы выражения логики в
шаблонах Angular
• Структурные директивы
Способы выражения логики в
шаблонах Angular
• Структурные директивы
• Pipes
Способы выражения логики в
шаблонах Angular
• Структурные директивы
• Pipes
• Кастомные структурные директивы
Способы выражения логики в
шаблонах Angular
• Структурные директивы
• Pipes
• Свои структурные директивы
• ViewModel + Структурные директивы
Структурные Директивы
NgIf, NgFor, and NgSwitch...
Article List
<article-preview
*ngFor="let article of results"
[article]="article">
</article-preview
Article List (не нужен)
<article-preview
*ngFor="let article of results"
[article]="article">
</article-preview
Pipes
<article-preview
*ngFor="let article of (results | intrestingArticles)"
[article]="article">
</article-preview>
@Pipe({ name: 'intrestingArticles' })
export class ArticlesPipe implements PipeTransform {
transform(items: any[]) {
return items.filter(item => item.intresting);
}
}
Pipes
<article-preview
*ngFor="let article of (results | intrestingArticles)"
[article]="article">
</article-preview>
@Pipe({ name: 'intrestingArticles' })
export class ArticlesPipe implements PipeTransform {
transform(items: any[]) {
return items.filter(item => item.intresting);
}
}
Pipes
<article-preview
*ngFor="let article of (results | intrestingArticles)"
[article]="article">
</article-preview>
@Pipe({ name: 'intrestingArticles' })
export class ArticlesPipe implements PipeTransform {
transform(items: any[]) {
return items.filter(item => item.intresting);
}
}
Pipes
<article-preview
*ngFor="let article of (results | intrestingArticles)"
[article]="article">
</article-preview>
@Pipe({ name: 'intrestingArticles' })
export class ArticlesPipe implements PipeTransform {
transform(items: any[]) {
return items.filter(item => item.intresting);
}
}
Свои структурные директивы
@Directive({
selector: '[appDelay]'
})
export class DelayDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef
) { }
@Input()
set appDelay(time: number): void { }
}
Свои структурные директивы
@Directive({
selector: '[appDelay]'
})
export class DelayDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef
) { }
@Input()
set appDelay(time: number): void { }
}
Свои структурные директивы
@Directive({
selector: '[appDelay]'
})
export class DelayDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef
) { }
@Input()
set appDelay(time: number): void { }
}
Свои структурные директивы
@Directive({
selector: '[appDelay]'
})
export class DelayDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef
) { }
@Input()
set appDelay(time: number): void { }
}
Свои структурные директивы
<card *appDelay="5000">
{{item}}
</card>
Свои структурные директивы
<card *appDelay="5000">
{{item}}
</card>
Свои структурные директивы
@Input()
set appDelay(time: number): void {
setTimeout(
() => {
this.viewContainerRef.createEmbeddedView(this.templateRef);
},
time);
}
Свои структурные директивы
@Input()
set appDelay(time: number): void {
setTimeout(
() => {
this.viewContainerRef.createEmbeddedView(this.templateRef);
},
time);
}
Свои структурные директивы
@Input()
set appDelay(time: number): void {
setTimeout(
() => {
this.viewContainerRef.createEmbeddedView(this.templateRef);
},
time);
}
ViewModel + Структурные директивы
https://www.youtube.com/watch?v=WIgXOG49mdI
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
https://github.com/aiboy/COD.js
onUpdate(data) {
this.fire('update', data.map((item) => {
return { id: item, selected: item === this.selectedItemId }
}));
this.data = data;
}
onItemSelected(id) {
this.selectedItemId = id;
this.onUpdate(this.data);
}
ViewModel + Структурные директивы
https://www.youtube.com/watch?v=WIgXOG49mdI
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
https://github.com/aiboy/COD.js
onUpdate(data) {
this.fire('update', data.map((item) => {
return { id: item, selected: item === this.selectedItemId }
}));
this.data = data;
}
onItemSelected(id) {
this.selectedItemId = id;
this.onUpdate(this.data);
}
ViewModel + Структурные директивы
https://www.youtube.com/watch?v=WIgXOG49mdI
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
https://github.com/aiboy/COD.js
onUpdate(data) {
this.fire('update', data.map((item) => {
return { id: item, selected: item === this.selectedItemId }
}));
this.data = data;
}
onItemSelected(id) {
this.selectedItemId = id;
this.onUpdate(this.data);
}
ViewModel + Структурные директивы
https://www.youtube.com/watch?v=WIgXOG49mdI
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
https://github.com/aiboy/COD.js
onUpdate(data) {
this.fire('update', data.map((item) => {
return { id: item, selected: item === this.selectedItemId }
}));
this.data = data;
}
onItemSelected(id) {
this.selectedItemId = id;
this.onUpdate(this.data);
}
Контекст
Контекст
@Component({
selector: 'child',
template: '<div>child</div>'
})
export class Child {
constructor(private parent: Parent) {
parent.sharedList.push('Me.');
}
}
Контекст
@Component({
selector: 'child',
template: '<div>child</div>'
})
export class Child {
constructor(private parent: Parent) {
parent.sharedList.push('Me.');
}
}
Контекст
@Component({
selector: 'child',
template: '<div>child</div>'
})
export class Child {
constructor(private parent: Parent) {
parent.sharedList.push('Me.');
}
}
и т.д.
Не забудьте
помыть руки!
Tweeter: @Ai_boy
Gitter: aiboy
http://bit.ly/2s6VDcK
#ritfest2017

Mais conteúdo relacionado

Mais procurados

Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6
Ray Ploski
 

Mais procurados (20)

Firebase ng2 zurich
Firebase ng2 zurichFirebase ng2 zurich
Firebase ng2 zurich
 
Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016
 
Angular 2.0 Dependency injection
Angular 2.0 Dependency injectionAngular 2.0 Dependency injection
Angular 2.0 Dependency injection
 
Workshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptWorkshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScript
 
Workshop 26: React Native - The Native Side
Workshop 26: React Native - The Native SideWorkshop 26: React Native - The Native Side
Workshop 26: React Native - The Native Side
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
Angular2: Quick overview with 2do app example
Angular2: Quick overview with 2do app exampleAngular2: Quick overview with 2do app example
Angular2: Quick overview with 2do app example
 
Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6Introduction to CDI and DI in Java EE 6
Introduction to CDI and DI in Java EE 6
 
Android TDD
Android TDDAndroid TDD
Android TDD
 
Angular 2 introduction
Angular 2 introductionAngular 2 introduction
Angular 2 introduction
 
Boosting Angular runtime performance
Boosting Angular runtime performanceBoosting Angular runtime performance
Boosting Angular runtime performance
 
Dependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutesDependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutes
 
AngularJs $provide API internals & circular dependency problem.
AngularJs $provide API internals & circular dependency problem.AngularJs $provide API internals & circular dependency problem.
AngularJs $provide API internals & circular dependency problem.
 
CDI: How do I ?
CDI: How do I ?CDI: How do I ?
CDI: How do I ?
 
AngularJs
AngularJsAngularJs
AngularJs
 
Introducing Vuex in your project
Introducing Vuex in your projectIntroducing Vuex in your project
Introducing Vuex in your project
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andev
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React Alicante
 
Net conf BG xamarin lecture
Net conf BG xamarin lectureNet conf BG xamarin lecture
Net conf BG xamarin lecture
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 

Semelhante a Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)

Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Jeado Ko
 

Semelhante a Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB) (20)

Angular2 + rxjs
Angular2 + rxjsAngular2 + rxjs
Angular2 + rxjs
 
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
 
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점 Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
 
Hidden Docs in Angular
Hidden Docs in AngularHidden Docs in Angular
Hidden Docs in Angular
 
Exploring Angular 2 - Episode 1
Exploring Angular 2 - Episode 1Exploring Angular 2 - Episode 1
Exploring Angular 2 - Episode 1
 
Building a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web ServicesBuilding a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web Services
 
Angular 2 - The Next Framework
Angular 2 - The Next FrameworkAngular 2 - The Next Framework
Angular 2 - The Next Framework
 
React render props
React render propsReact render props
React render props
 
Server side rendering with React and Symfony
Server side rendering with React and SymfonyServer side rendering with React and Symfony
Server side rendering with React and Symfony
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법
 
Introduction to React for Frontend Developers
Introduction to React for Frontend DevelopersIntroduction to React for Frontend Developers
Introduction to React for Frontend Developers
 
React native app with type script tutorial
React native app with type script tutorialReact native app with type script tutorial
React native app with type script tutorial
 
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
 
angular fundamentals.pdf angular fundamentals.pdf
angular fundamentals.pdf angular fundamentals.pdfangular fundamentals.pdf angular fundamentals.pdf
angular fundamentals.pdf angular fundamentals.pdf
 
Ways to Set Focus on an Input Field After Rendering in React.pptx
Ways to Set Focus on an Input Field After Rendering in React.pptxWays to Set Focus on an Input Field After Rendering in React.pptx
Ways to Set Focus on an Input Field After Rendering in React.pptx
 
Lessons from a year of building apps with React Native
Lessons from a year of building apps with React NativeLessons from a year of building apps with React Native
Lessons from a year of building apps with React Native
 
React & Redux for noobs
React & Redux for noobsReact & Redux for noobs
React & Redux for noobs
 
React: JSX and Top Level API
React: JSX and Top Level APIReact: JSX and Top Level API
React: JSX and Top Level API
 
Peggy angular 2 in meteor
Peggy   angular 2 in meteorPeggy   angular 2 in meteor
Peggy angular 2 in meteor
 
How to create components in react js
How to create components in react jsHow to create components in react js
How to create components in react js
 

Mais de Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

Mais de Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Último

Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
Epec Engineered Technologies
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
MsecMca
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 

Último (20)

Unit 2- Effective stress & Permeability.pdf
Unit 2- Effective stress & Permeability.pdfUnit 2- Effective stress & Permeability.pdf
Unit 2- Effective stress & Permeability.pdf
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghly
 
Introduction to Serverless with AWS Lambda
Introduction to Serverless with AWS LambdaIntroduction to Serverless with AWS Lambda
Introduction to Serverless with AWS Lambda
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 
2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 
Hostel management system project report..pdf
Hostel management system project report..pdfHostel management system project report..pdf
Hostel management system project report..pdf
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leap
 
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
 
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
COST-EFFETIVE  and Energy Efficient BUILDINGS ptxCOST-EFFETIVE  and Energy Efficient BUILDINGS ptx
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
 
22-prompt engineering noted slide shown.pdf
22-prompt engineering noted slide shown.pdf22-prompt engineering noted slide shown.pdf
22-prompt engineering noted slide shown.pdf
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torque
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 

Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)