SlideShare a Scribd company logo
@Component({
template: `
<form [formGroup]="form">
<input type="text"
formControlName="name" />
</form>`})
class ProductComponent {
form = new FormGroup({
name: new FormControl(
'',
Validators.required
),
});
}
console.log(form.value);
/*
{
name: " "
}
*/
@Component({
template: `
<form [formGroup]="form">
<input type="text"
formControlName="name" />
</form>`})
class ProductComponent {
form = new FormGroup({
name: new FormControl(
'',
Validators.required
),
});
}
console.log(form.value);
/*
{
name: " "
}
*/
@Component({
template: `
<form [formGroup]="form">
<input type="text"
formControlName="name" />
</form>`})
class ProductComponent {
form = new FormGroup({
name: new FormControl(
'',
Validators.required
),
});
}
if (form.valid) {
this.http.post(
'/api/product',
form.value
).subscribe(res => {
alert(' !');
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
<div formGroupName="discount">
<input type="text" formControlName="price" />
<input type="text" formControlName="period" />
</div>
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl('', Validators.required),
discount: new FormGroup({
price: new FormControl(''),
period: new FormControl(''),
})
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
<div formGroupName="discount">
<input type="text" formControlName="price" />
<input type="text" formControlName="period" />
</div>
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl('', Validators.required),
discount: new FormGroup({
price: new FormControl(''),
period: new FormControl(''),
})
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<app-discount
formControlName="discount" />
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(''),
discount: new FormControl(),
});
}
@Component({
selector: 'app-discount',
template: `
<form [formGroup]="discount">
<!-- ... -->
</div> `})
class DiscountComponent {
discount = new FormGroup({
price: new FormControl(''),
period: new FormControl(''),
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<app-discount
formControlName="discount" />
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(''),
discount: new FormControl(),
});
}
@Component({
selector: 'app-discount',
template: `
<form [formGroup]="discount">
<!-- ... -->
</div> `})
class DiscountComponent {
discount = new FormGroup({
price: new FormControl(''),
period: new FormControl(''),
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<app-discount
formControlName="discount" />
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(''),
discount: new FormControl(),
});
}
@Component({
selector: 'app-discount',
template: `
<form [formGroup]="discount">
<!-- ... -->
</div> `})
class DiscountComponent {
discount = new FormGroup({
price: new FormControl(''),
period: new FormControl(''),
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<app-discount
formControlName="discount" />
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(''),
discount: new FormControl(),
});
}
@Component({
selector: 'app-discount',
template: `
<form [formGroup]="discount">
<!-- ... -->
</div> `})
class DiscountComponent {
discount = new FormGroup({
price: new FormControl(''),
period: new FormControl(''),
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
<span *ngIf="form.get('name')?.errors?.required">
</span>
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(
'',
Validators.required
),
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
<span *ngIf="form.get('name')?.errors?.required">
</span>
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(
'',
Validators.required
),
});
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
<span *ngIf="form.get('name')?.errors?.required">
</span>
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(
'',
Validators.required
),
});
}
function required(ctrl) {
if (!ctrl.value) {
return {required: true};
}
return null;
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
<span *ngIf="form.get('name')?.errors?.required">
</span>
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(
'',
Validators.required
),
});
}
function required(ctrl) {
if (!ctrl.value) {
return {required: true};
}
return null;
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(
'',
ctrl => '' === ctrl.value ? {required: true} : null,
),
},
form => isEmpty(form.value) ? {error: true} : null
);
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(
'',
ctrl => '' === ctrl.value ? {required: true} : null,
),
},
form => isEmpty(form.value) ? {error: true} : null
);
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name" />
</form>`})
class ExampleComponent {
form = new FormGroup({
name: new FormControl(
'',
ctrl => '' === ctrl.value ? {required: true} : null,
),
},
form => isEmpty(form.value) ? {error: true} : null
);
}
// POST: /product/8022881030
// Response 400
{
error_code: -10003,
validations: {
"name": [" "],
"discountA.period":
[" 0
"]
}
}
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<input type="text"
formControlName="price" />
<div formGroupName="discountA">
<input type="text"
formControlName="period" />
</div>
</form>
// POST: /product/8022881030
// Response 400
{
error_code: -10003,
validations: {
"name": [" "],
"discountA.period":
[" 0
"]
}
}
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<input type="text"
formControlName="price" />
<div formGroupName="discountA">
<input type="text"
formControlName="period" />
</div>
</form>
// POST: /product/8022881030
// Response 400
{
error_code: -10003,
validations: {
"name": [" "],
"discountA.period":
[" 0
"]
}
}
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<input type="text"
formControlName="price" />
<div formGroupName="discountA">
<input type="text"
formControlName="period" />
</div>
</form>
<app-error> </app-error>
// POST: /product/8022881030
// Response 400
{
error_code: -10003,
validations: {
"name": [" "],
"discountA.period":
[" 0
"]
}
}
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<input type="text"
formControlName="price" />
<div formGroupName="discountA">
<input type="text"
formControlName="period" />
</div>
</form>
<app-error> </app-error>
// POST: /product/8022881030
// Response 400
{
error_code: -10003,
validations: {
"name": [" "],
"discountA.period":
[" 0
"]
}
}
<form [formGroup]="form">
<input type="text"
formControlName="name" />
<input type="text"
formControlName="price" />
<div formGroupName="discountA">
<input type="text"
formControlName="period" />
</div>
</form>
<app-error> </app-error>
<app-error> ...</app-error>
<div *ngIf="name.invalid && (name.dirty || name.touched)"
class="alert alert-danger">
<div *ngIf="name.errors.required">
.
</div>
<div *ngIf="name.errors.minlength">
4 .
</div>
<div *ngIf="name.errors.forbiddenName">
.
</div>
</div>
<input id="name" class="form-control" formControlName="name" />
<input id="name" class="form-control" formControlName="name" />
import { Component } from "@angular/core";
import { FormGroup, FormControl, Validators } from "@angular/forms";
@Component({
selector: "my-app",
template: `
<form [formGroup]="form">
<input formControlName="name" />
</form>
<pre><code>{{form.value | json}}</code></pre>
`
})
export class AppComponent {
form = new FormGroup({
name: new FormControl("", Validators.required)
});
}
import { Component } from "@angular/core";
import { FormGroup, FormControl, Validators } from "@angular/forms";
@Component({
selector: "my-app",
template: `
<form [formGroup]="form">
<input formControlName="name" />
</form>
<pre><code>{{form.value | json}}</code></pre>
`
})
export class AppComponent {
form = new FormGroup({
name: new FormControl("", Validators.required)
});
}
@Component({
selector: 'app-product-list',
template: `
<div>
click count: {{count}}
<button type="button" (click)="onClick()">click</button>
</div>
`
})
export class ProductListComponent {
count = 0;
onClick() {
this.count += 1;
}
}
@Component({
selector: 'app-product-list',
template: `
<div>
click count: {{count}}
<button type="button" (click)="onClick()">click</button>
</div>
`
})
export class ProductListComponent {
count = 0;
onClick() {
this.count += 1;
}
}
const origin = window.setTimeout;
window.setTimeout = function(...args) {
origin(...args);
ngZone.runChangeDetection();
}
// window.clearTimeout
// ...
@NgModule({
imports: [
RouterModule.forRoot([
{
path: '/product',
loadChildren: () =>
import('./product/product.module')
.then(mod => mod.ProductModule)
},
{
path: '/delivery',
loadChildren: () =>
import('./delivery/delivery.module')
.then(mod => mod.DeliveryModule)
}
])
]
})
class EntryModule {}
@NgModule({
imports: [
RouterModule.forRoot([
{
path: '/product',
loadChildren: () =>
import('./product/product.module')
.then(mod => mod.ProductModule)
},
{
path: '/delivery',
loadChildren: () =>
import('./delivery/delivery.module')
.then(mod => mod.DeliveryModule)
}
], {preloadingStrategy: PreloadAllModules})
]
})
class EntryModule {}
@NgModule({
imports: [
RouterModule.forRoot([
{
path: '/product',
loadChildren: () =>
import('./product/product.module')
.then(mod => mod.ProductModule)
},
{
path: '/delivery',
loadChildren: () =>
import('./delivery/delivery.module')
.then(mod => mod.DeliveryModule)
}
], {preloadingStrategy: PreloadAllModules})
]
})
class EntryModule {}
@NgModule({
providers: [{
provide: HTTP_INTERCEPTORS,
useClass: ApiPrefixInterceptorService,
multi: true,
},
{
provide: HTTP_INTERCEPTORS,
useClass: HttpErrorHandlerInterceptor,
multi: true,
},
{
provide: HTTP_INTERCEPTORS,
useClass: DistinctRequest,
multi: true,
}]
})
export class AppModule {}
router.events
.pipe(
filter(e => e instanceof NavigationEnd)
)
.subscribe(e => {
console.log(e); // NavigationEnd ('/product')
});
router.events
.pipe(
filter(e => e instanceof NavigationEnd),
pairwise()
)
.subscribe(e => {
console.log(e); // NavigationEnd ('/product')
});
router.events
.pipe(
filter(e => e instanceof NavigationEnd),
pairwise()
)
.subscribe(e => {
console.log(e); // NavigationEnd ('/product')
});
const subscription = activatedRoute.queryParams.pipe(
switchMap(queryParams => httpClient.get('/api/product', queryParams)
).subscribe();
curl -F 'data=@path/to/local/a.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/b.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/c.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/d.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/e.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/f.js' UPLOAD_ADDRESS
# ...
curl -F 'data=@path/to/local/a.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/b.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/c.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/d.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/e.js' UPLOAD_ADDRESS
curl -F 'data=@path/to/local/f.js' UPLOAD_ADDRESS
# ...
import {uploadFilesToKakaoCDN} from '@commerce-ui/deploy-toolkit'
(async () => {
const cdnUrl = await uploadFilesToKakaoCDN({
path: 'dist/'
});
})();
카카오커머스를 지탱하는 Angular
카카오커머스를 지탱하는 Angular
카카오커머스를 지탱하는 Angular

More Related Content

Similar to 카카오커머스를 지탱하는 Angular

Angular 2.0 forms
Angular 2.0 formsAngular 2.0 forms
Angular 2.0 forms
Eyal Vardi
 
Beginner’s tutorial (part 2) how to integrate redux-saga in react native app
Beginner’s tutorial (part 2) how to integrate redux-saga in react native appBeginner’s tutorial (part 2) how to integrate redux-saga in react native app
Beginner’s tutorial (part 2) how to integrate redux-saga in react native app
Katy Slemon
 
QCon 2015 - Thinking in components: A new paradigm for Web UI
QCon 2015 - Thinking in components: A new paradigm for Web UIQCon 2015 - Thinking in components: A new paradigm for Web UI
QCon 2015 - Thinking in components: A new paradigm for Web UI
Oliver Häger
 
Django Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, TricksDjango Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, Tricks
Shawn Rider
 
Form demoinplaywithmysql
Form demoinplaywithmysqlForm demoinplaywithmysql
Form demoinplaywithmysql
Knoldus Inc.
 
Symfony2. Form and Validation
Symfony2. Form and ValidationSymfony2. Form and Validation
Symfony2. Form and Validation
Vladimir Doroshenko
 
Intro to Jinja2 Templates - San Francisco Flask Meetup
Intro to Jinja2 Templates - San Francisco Flask MeetupIntro to Jinja2 Templates - San Francisco Flask Meetup
Intro to Jinja2 Templates - San Francisco Flask Meetup
Alan Hamlett
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용
KyeongMook "Kay" Cha
 
Django Class-based views (Slovenian)
Django Class-based views (Slovenian)Django Class-based views (Slovenian)
Django Class-based views (Slovenian)Luka Zakrajšek
 
Михаил Крайнюк - Form API + Drupal 8: Form and AJAX
Михаил Крайнюк - Form API + Drupal 8: Form and AJAXМихаил Крайнюк - Form API + Drupal 8: Form and AJAX
Михаил Крайнюк - Form API + Drupal 8: Form and AJAX
DrupalSib
 
Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0
gedoplan
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Fabien Potencier
 
20150515ken
20150515ken20150515ken
20150515ken
LearningTech
 
단일 페이지 인터페이스 웹/앱 개발
단일 페이지 인터페이스 웹/앱 개발단일 페이지 인터페이스 웹/앱 개발
단일 페이지 인터페이스 웹/앱 개발
동수 장
 
Odoo Experience 2018 - Develop an App with the Odoo Framework
Odoo Experience 2018 - Develop an App with the Odoo FrameworkOdoo Experience 2018 - Develop an App with the Odoo Framework
Odoo Experience 2018 - Develop an App with the Odoo Framework
ElínAnna Jónasdóttir
 
준비하세요 Angular js 2.0
준비하세요 Angular js 2.0준비하세요 Angular js 2.0
준비하세요 Angular js 2.0
Jeado Ko
 
Gutenberg sous le capot, modules réutilisables
Gutenberg sous le capot, modules réutilisablesGutenberg sous le capot, modules réutilisables
Gutenberg sous le capot, modules réutilisables
Riad Benguella
 
Jinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask MeetupJinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask Meetup
Alan Hamlett
 
Vue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and VuexVue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and Vuex
Christoffer Noring
 
PWA night vol.11 20191218
PWA night vol.11 20191218PWA night vol.11 20191218
PWA night vol.11 20191218
bitpart
 

Similar to 카카오커머스를 지탱하는 Angular (20)

Angular 2.0 forms
Angular 2.0 formsAngular 2.0 forms
Angular 2.0 forms
 
Beginner’s tutorial (part 2) how to integrate redux-saga in react native app
Beginner’s tutorial (part 2) how to integrate redux-saga in react native appBeginner’s tutorial (part 2) how to integrate redux-saga in react native app
Beginner’s tutorial (part 2) how to integrate redux-saga in react native app
 
QCon 2015 - Thinking in components: A new paradigm for Web UI
QCon 2015 - Thinking in components: A new paradigm for Web UIQCon 2015 - Thinking in components: A new paradigm for Web UI
QCon 2015 - Thinking in components: A new paradigm for Web UI
 
Django Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, TricksDjango Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, Tricks
 
Form demoinplaywithmysql
Form demoinplaywithmysqlForm demoinplaywithmysql
Form demoinplaywithmysql
 
Symfony2. Form and Validation
Symfony2. Form and ValidationSymfony2. Form and Validation
Symfony2. Form and Validation
 
Intro to Jinja2 Templates - San Francisco Flask Meetup
Intro to Jinja2 Templates - San Francisco Flask MeetupIntro to Jinja2 Templates - San Francisco Flask Meetup
Intro to Jinja2 Templates - San Francisco Flask Meetup
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용
 
Django Class-based views (Slovenian)
Django Class-based views (Slovenian)Django Class-based views (Slovenian)
Django Class-based views (Slovenian)
 
Михаил Крайнюк - Form API + Drupal 8: Form and AJAX
Михаил Крайнюк - Form API + Drupal 8: Form and AJAXМихаил Крайнюк - Form API + Drupal 8: Form and AJAX
Михаил Крайнюк - Form API + Drupal 8: Form and AJAX
 
Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0Neuerungen in JavaServer Faces 2.0
Neuerungen in JavaServer Faces 2.0
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
 
20150515ken
20150515ken20150515ken
20150515ken
 
단일 페이지 인터페이스 웹/앱 개발
단일 페이지 인터페이스 웹/앱 개발단일 페이지 인터페이스 웹/앱 개발
단일 페이지 인터페이스 웹/앱 개발
 
Odoo Experience 2018 - Develop an App with the Odoo Framework
Odoo Experience 2018 - Develop an App with the Odoo FrameworkOdoo Experience 2018 - Develop an App with the Odoo Framework
Odoo Experience 2018 - Develop an App with the Odoo Framework
 
준비하세요 Angular js 2.0
준비하세요 Angular js 2.0준비하세요 Angular js 2.0
준비하세요 Angular js 2.0
 
Gutenberg sous le capot, modules réutilisables
Gutenberg sous le capot, modules réutilisablesGutenberg sous le capot, modules réutilisables
Gutenberg sous le capot, modules réutilisables
 
Jinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask MeetupJinja2 Templates - San Francisco Flask Meetup
Jinja2 Templates - San Francisco Flask Meetup
 
Vue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and VuexVue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and Vuex
 
PWA night vol.11 20191218
PWA night vol.11 20191218PWA night vol.11 20191218
PWA night vol.11 20191218
 

More from if kakao

바닥부터 시작하는 Vue 테스트와 리팩토링
바닥부터 시작하는 Vue 테스트와 리팩토링바닥부터 시작하는 Vue 테스트와 리팩토링
바닥부터 시작하는 Vue 테스트와 리팩토링
if kakao
 
프렌즈타임 웹앱 삽질기
프렌즈타임 웹앱 삽질기프렌즈타임 웹앱 삽질기
프렌즈타임 웹앱 삽질기
if kakao
 
카프카 기반의 대규모 모니터링 플랫폼 개발이야기
카프카 기반의 대규모 모니터링 플랫폼 개발이야기카프카 기반의 대규모 모니터링 플랫폼 개발이야기
카프카 기반의 대규모 모니터링 플랫폼 개발이야기
if kakao
 
TOROS N2 - lightweight approximate Nearest Neighbor library
TOROS N2 - lightweight approximate Nearest Neighbor libraryTOROS N2 - lightweight approximate Nearest Neighbor library
TOROS N2 - lightweight approximate Nearest Neighbor library
if kakao
 
딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식
if kakao
 
딥러닝을 활용한 뉴스 메타 태깅
딥러닝을 활용한 뉴스 메타 태깅딥러닝을 활용한 뉴스 메타 태깅
딥러닝을 활용한 뉴스 메타 태깅
if kakao
 
눈으로 듣는 음악 추천 시스템
눈으로 듣는 음악 추천 시스템눈으로 듣는 음악 추천 시스템
눈으로 듣는 음악 추천 시스템
if kakao
 
Keynote / 2018
Keynote / 2018Keynote / 2018
Keynote / 2018
if kakao
 
카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개
if kakao
 
다음웹툰의 UX(Animation, Transition, Custom View)
다음웹툰의 UX(Animation, Transition, Custom View)다음웹툰의 UX(Animation, Transition, Custom View)
다음웹툰의 UX(Animation, Transition, Custom View)
if kakao
 
모바일 게임플랫폼과 인프라 구축 경험기
모바일 게임플랫폼과 인프라 구축 경험기모바일 게임플랫폼과 인프라 구축 경험기
모바일 게임플랫폼과 인프라 구축 경험기
if kakao
 
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
if kakao
 
카카오뱅크 모바일앱 개발 이야기
카카오뱅크 모바일앱 개발 이야기카카오뱅크 모바일앱 개발 이야기
카카오뱅크 모바일앱 개발 이야기
if kakao
 
다음 모바일 첫 화면 개선기
다음 모바일 첫 화면 개선기다음 모바일 첫 화면 개선기
다음 모바일 첫 화면 개선기
if kakao
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
if kakao
 
액티브X 없는 블록체인 기반 PKI 시스템
액티브X 없는 블록체인 기반 PKI 시스템액티브X 없는 블록체인 기반 PKI 시스템
액티브X 없는 블록체인 기반 PKI 시스템
if kakao
 
Klaytn: Service-Oriented Enterprise-Grade Public Blockchain Platform
Klaytn: Service-Oriented Enterprise-Grade Public Blockchain PlatformKlaytn: Service-Oriented Enterprise-Grade Public Blockchain Platform
Klaytn: Service-Oriented Enterprise-Grade Public Blockchain Platform
if kakao
 
Kakao Cloud Native Platform, 9rum
Kakao Cloud Native Platform, 9rumKakao Cloud Native Platform, 9rum
Kakao Cloud Native Platform, 9rum
if kakao
 
카프카, 산전수전 노하우
카프카, 산전수전 노하우카프카, 산전수전 노하우
카프카, 산전수전 노하우
if kakao
 
스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략
if kakao
 

More from if kakao (20)

바닥부터 시작하는 Vue 테스트와 리팩토링
바닥부터 시작하는 Vue 테스트와 리팩토링바닥부터 시작하는 Vue 테스트와 리팩토링
바닥부터 시작하는 Vue 테스트와 리팩토링
 
프렌즈타임 웹앱 삽질기
프렌즈타임 웹앱 삽질기프렌즈타임 웹앱 삽질기
프렌즈타임 웹앱 삽질기
 
카프카 기반의 대규모 모니터링 플랫폼 개발이야기
카프카 기반의 대규모 모니터링 플랫폼 개발이야기카프카 기반의 대규모 모니터링 플랫폼 개발이야기
카프카 기반의 대규모 모니터링 플랫폼 개발이야기
 
TOROS N2 - lightweight approximate Nearest Neighbor library
TOROS N2 - lightweight approximate Nearest Neighbor libraryTOROS N2 - lightweight approximate Nearest Neighbor library
TOROS N2 - lightweight approximate Nearest Neighbor library
 
딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식
 
딥러닝을 활용한 뉴스 메타 태깅
딥러닝을 활용한 뉴스 메타 태깅딥러닝을 활용한 뉴스 메타 태깅
딥러닝을 활용한 뉴스 메타 태깅
 
눈으로 듣는 음악 추천 시스템
눈으로 듣는 음악 추천 시스템눈으로 듣는 음악 추천 시스템
눈으로 듣는 음악 추천 시스템
 
Keynote / 2018
Keynote / 2018Keynote / 2018
Keynote / 2018
 
카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개
 
다음웹툰의 UX(Animation, Transition, Custom View)
다음웹툰의 UX(Animation, Transition, Custom View)다음웹툰의 UX(Animation, Transition, Custom View)
다음웹툰의 UX(Animation, Transition, Custom View)
 
모바일 게임플랫폼과 인프라 구축 경험기
모바일 게임플랫폼과 인프라 구축 경험기모바일 게임플랫폼과 인프라 구축 경험기
모바일 게임플랫폼과 인프라 구축 경험기
 
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
 
카카오뱅크 모바일앱 개발 이야기
카카오뱅크 모바일앱 개발 이야기카카오뱅크 모바일앱 개발 이야기
카카오뱅크 모바일앱 개발 이야기
 
다음 모바일 첫 화면 개선기
다음 모바일 첫 화면 개선기다음 모바일 첫 화면 개선기
다음 모바일 첫 화면 개선기
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
 
액티브X 없는 블록체인 기반 PKI 시스템
액티브X 없는 블록체인 기반 PKI 시스템액티브X 없는 블록체인 기반 PKI 시스템
액티브X 없는 블록체인 기반 PKI 시스템
 
Klaytn: Service-Oriented Enterprise-Grade Public Blockchain Platform
Klaytn: Service-Oriented Enterprise-Grade Public Blockchain PlatformKlaytn: Service-Oriented Enterprise-Grade Public Blockchain Platform
Klaytn: Service-Oriented Enterprise-Grade Public Blockchain Platform
 
Kakao Cloud Native Platform, 9rum
Kakao Cloud Native Platform, 9rumKakao Cloud Native Platform, 9rum
Kakao Cloud Native Platform, 9rum
 
카프카, 산전수전 노하우
카프카, 산전수전 노하우카프카, 산전수전 노하우
카프카, 산전수전 노하우
 
스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략
 

Recently uploaded

Halogenation process of chemical process industries
Halogenation process of chemical process industriesHalogenation process of chemical process industries
Halogenation process of chemical process industries
MuhammadTufail242431
 
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdfHybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
fxintegritypublishin
 
power quality voltage fluctuation UNIT - I.pptx
power quality voltage fluctuation UNIT - I.pptxpower quality voltage fluctuation UNIT - I.pptx
power quality voltage fluctuation UNIT - I.pptx
ViniHema
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
TeeVichai
 
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
bakpo1
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
JoytuBarua2
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
karthi keyan
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
Robbie Edward Sayers
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
MdTanvirMahtab2
 
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSETECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
DuvanRamosGarzon1
 
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
AJAYKUMARPUND1
 
The Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdfThe Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdf
Pipe Restoration Solutions
 
Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024
Massimo Talia
 
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdfAKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
SamSarthak3
 
Gen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdfGen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdf
gdsczhcet
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Dr.Costas Sachpazis
 
addressing modes in computer architecture
addressing modes  in computer architectureaddressing modes  in computer architecture
addressing modes in computer architecture
ShahidSultan24
 
Immunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary AttacksImmunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary Attacks
gerogepatton
 
ASME IX(9) 2007 Full Version .pdf
ASME IX(9)  2007 Full Version       .pdfASME IX(9)  2007 Full Version       .pdf
ASME IX(9) 2007 Full Version .pdf
AhmedHussein950959
 
Courier management system project report.pdf
Courier management system project report.pdfCourier management system project report.pdf
Courier management system project report.pdf
Kamal Acharya
 

Recently uploaded (20)

Halogenation process of chemical process industries
Halogenation process of chemical process industriesHalogenation process of chemical process industries
Halogenation process of chemical process industries
 
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdfHybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
 
power quality voltage fluctuation UNIT - I.pptx
power quality voltage fluctuation UNIT - I.pptxpower quality voltage fluctuation UNIT - I.pptx
power quality voltage fluctuation UNIT - I.pptx
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
 
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
 
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSETECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
 
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
 
The Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdfThe Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdf
 
Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024
 
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdfAKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
 
Gen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdfGen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdf
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
 
addressing modes in computer architecture
addressing modes  in computer architectureaddressing modes  in computer architecture
addressing modes in computer architecture
 
Immunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary AttacksImmunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary Attacks
 
ASME IX(9) 2007 Full Version .pdf
ASME IX(9)  2007 Full Version       .pdfASME IX(9)  2007 Full Version       .pdf
ASME IX(9) 2007 Full Version .pdf
 
Courier management system project report.pdf
Courier management system project report.pdfCourier management system project report.pdf
Courier management system project report.pdf
 

카카오커머스를 지탱하는 Angular

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> </form>`}) class ProductComponent { form = new FormGroup({ name: new FormControl( '', Validators.required ), }); } console.log(form.value); /* { name: " " } */
  • 16. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> </form>`}) class ProductComponent { form = new FormGroup({ name: new FormControl( '', Validators.required ), }); } console.log(form.value); /* { name: " " } */
  • 17. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> </form>`}) class ProductComponent { form = new FormGroup({ name: new FormControl( '', Validators.required ), }); } if (form.valid) { this.http.post( '/api/product', form.value ).subscribe(res => { alert(' !'); }); }
  • 18. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <div formGroupName="discount"> <input type="text" formControlName="price" /> <input type="text" formControlName="period" /> </div> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl('', Validators.required), discount: new FormGroup({ price: new FormControl(''), period: new FormControl(''), }) }); }
  • 19. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <div formGroupName="discount"> <input type="text" formControlName="price" /> <input type="text" formControlName="period" /> </div> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl('', Validators.required), discount: new FormGroup({ price: new FormControl(''), period: new FormControl(''), }) }); }
  • 20. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <app-discount formControlName="discount" /> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl(''), discount: new FormControl(), }); } @Component({ selector: 'app-discount', template: ` <form [formGroup]="discount"> <!-- ... --> </div> `}) class DiscountComponent { discount = new FormGroup({ price: new FormControl(''), period: new FormControl(''), }); }
  • 21. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <app-discount formControlName="discount" /> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl(''), discount: new FormControl(), }); } @Component({ selector: 'app-discount', template: ` <form [formGroup]="discount"> <!-- ... --> </div> `}) class DiscountComponent { discount = new FormGroup({ price: new FormControl(''), period: new FormControl(''), }); }
  • 22. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <app-discount formControlName="discount" /> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl(''), discount: new FormControl(), }); } @Component({ selector: 'app-discount', template: ` <form [formGroup]="discount"> <!-- ... --> </div> `}) class DiscountComponent { discount = new FormGroup({ price: new FormControl(''), period: new FormControl(''), }); }
  • 23. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <app-discount formControlName="discount" /> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl(''), discount: new FormControl(), }); } @Component({ selector: 'app-discount', template: ` <form [formGroup]="discount"> <!-- ... --> </div> `}) class DiscountComponent { discount = new FormGroup({ price: new FormControl(''), period: new FormControl(''), }); }
  • 24.
  • 25.
  • 26. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <span *ngIf="form.get('name')?.errors?.required"> </span> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl( '', Validators.required ), }); }
  • 27. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <span *ngIf="form.get('name')?.errors?.required"> </span> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl( '', Validators.required ), }); }
  • 28. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <span *ngIf="form.get('name')?.errors?.required"> </span> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl( '', Validators.required ), }); } function required(ctrl) { if (!ctrl.value) { return {required: true}; } return null; }
  • 29. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> <span *ngIf="form.get('name')?.errors?.required"> </span> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl( '', Validators.required ), }); } function required(ctrl) { if (!ctrl.value) { return {required: true}; } return null; }
  • 30. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl( '', ctrl => '' === ctrl.value ? {required: true} : null, ), }, form => isEmpty(form.value) ? {error: true} : null ); }
  • 31. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl( '', ctrl => '' === ctrl.value ? {required: true} : null, ), }, form => isEmpty(form.value) ? {error: true} : null ); }
  • 32. @Component({ template: ` <form [formGroup]="form"> <input type="text" formControlName="name" /> </form>`}) class ExampleComponent { form = new FormGroup({ name: new FormControl( '', ctrl => '' === ctrl.value ? {required: true} : null, ), }, form => isEmpty(form.value) ? {error: true} : null ); }
  • 33.
  • 34. // POST: /product/8022881030 // Response 400 { error_code: -10003, validations: { "name": [" "], "discountA.period": [" 0 "] } } <form [formGroup]="form"> <input type="text" formControlName="name" /> <input type="text" formControlName="price" /> <div formGroupName="discountA"> <input type="text" formControlName="period" /> </div> </form>
  • 35. // POST: /product/8022881030 // Response 400 { error_code: -10003, validations: { "name": [" "], "discountA.period": [" 0 "] } } <form [formGroup]="form"> <input type="text" formControlName="name" /> <input type="text" formControlName="price" /> <div formGroupName="discountA"> <input type="text" formControlName="period" /> </div> </form>
  • 36. // POST: /product/8022881030 // Response 400 { error_code: -10003, validations: { "name": [" "], "discountA.period": [" 0 "] } } <form [formGroup]="form"> <input type="text" formControlName="name" /> <input type="text" formControlName="price" /> <div formGroupName="discountA"> <input type="text" formControlName="period" /> </div> </form> <app-error> </app-error>
  • 37. // POST: /product/8022881030 // Response 400 { error_code: -10003, validations: { "name": [" "], "discountA.period": [" 0 "] } } <form [formGroup]="form"> <input type="text" formControlName="name" /> <input type="text" formControlName="price" /> <div formGroupName="discountA"> <input type="text" formControlName="period" /> </div> </form> <app-error> </app-error>
  • 38. // POST: /product/8022881030 // Response 400 { error_code: -10003, validations: { "name": [" "], "discountA.period": [" 0 "] } } <form [formGroup]="form"> <input type="text" formControlName="name" /> <input type="text" formControlName="price" /> <div formGroupName="discountA"> <input type="text" formControlName="period" /> </div> </form> <app-error> </app-error> <app-error> ...</app-error>
  • 39. <div *ngIf="name.invalid && (name.dirty || name.touched)" class="alert alert-danger"> <div *ngIf="name.errors.required"> . </div> <div *ngIf="name.errors.minlength"> 4 . </div> <div *ngIf="name.errors.forbiddenName"> . </div> </div> <input id="name" class="form-control" formControlName="name" />
  • 40. <input id="name" class="form-control" formControlName="name" />
  • 41. import { Component } from "@angular/core"; import { FormGroup, FormControl, Validators } from "@angular/forms"; @Component({ selector: "my-app", template: ` <form [formGroup]="form"> <input formControlName="name" /> </form> <pre><code>{{form.value | json}}</code></pre> ` }) export class AppComponent { form = new FormGroup({ name: new FormControl("", Validators.required) }); }
  • 42. import { Component } from "@angular/core"; import { FormGroup, FormControl, Validators } from "@angular/forms"; @Component({ selector: "my-app", template: ` <form [formGroup]="form"> <input formControlName="name" /> </form> <pre><code>{{form.value | json}}</code></pre> ` }) export class AppComponent { form = new FormGroup({ name: new FormControl("", Validators.required) }); }
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53. @Component({ selector: 'app-product-list', template: ` <div> click count: {{count}} <button type="button" (click)="onClick()">click</button> </div> ` }) export class ProductListComponent { count = 0; onClick() { this.count += 1; } }
  • 54. @Component({ selector: 'app-product-list', template: ` <div> click count: {{count}} <button type="button" (click)="onClick()">click</button> </div> ` }) export class ProductListComponent { count = 0; onClick() { this.count += 1; } }
  • 55.
  • 56.
  • 57. const origin = window.setTimeout; window.setTimeout = function(...args) { origin(...args); ngZone.runChangeDetection(); } // window.clearTimeout // ...
  • 58.
  • 59.
  • 60.
  • 61. @NgModule({ imports: [ RouterModule.forRoot([ { path: '/product', loadChildren: () => import('./product/product.module') .then(mod => mod.ProductModule) }, { path: '/delivery', loadChildren: () => import('./delivery/delivery.module') .then(mod => mod.DeliveryModule) } ]) ] }) class EntryModule {}
  • 62. @NgModule({ imports: [ RouterModule.forRoot([ { path: '/product', loadChildren: () => import('./product/product.module') .then(mod => mod.ProductModule) }, { path: '/delivery', loadChildren: () => import('./delivery/delivery.module') .then(mod => mod.DeliveryModule) } ], {preloadingStrategy: PreloadAllModules}) ] }) class EntryModule {}
  • 63. @NgModule({ imports: [ RouterModule.forRoot([ { path: '/product', loadChildren: () => import('./product/product.module') .then(mod => mod.ProductModule) }, { path: '/delivery', loadChildren: () => import('./delivery/delivery.module') .then(mod => mod.DeliveryModule) } ], {preloadingStrategy: PreloadAllModules}) ] }) class EntryModule {}
  • 64.
  • 65.
  • 66.
  • 67.
  • 68. @NgModule({ providers: [{ provide: HTTP_INTERCEPTORS, useClass: ApiPrefixInterceptorService, multi: true, }, { provide: HTTP_INTERCEPTORS, useClass: HttpErrorHandlerInterceptor, multi: true, }, { provide: HTTP_INTERCEPTORS, useClass: DistinctRequest, multi: true, }] }) export class AppModule {}
  • 69.
  • 70. router.events .pipe( filter(e => e instanceof NavigationEnd) ) .subscribe(e => { console.log(e); // NavigationEnd ('/product') });
  • 71. router.events .pipe( filter(e => e instanceof NavigationEnd), pairwise() ) .subscribe(e => { console.log(e); // NavigationEnd ('/product') });
  • 72. router.events .pipe( filter(e => e instanceof NavigationEnd), pairwise() ) .subscribe(e => { console.log(e); // NavigationEnd ('/product') });
  • 73. const subscription = activatedRoute.queryParams.pipe( switchMap(queryParams => httpClient.get('/api/product', queryParams) ).subscribe();
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84. curl -F 'data=@path/to/local/a.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/b.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/c.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/d.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/e.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/f.js' UPLOAD_ADDRESS # ...
  • 85. curl -F 'data=@path/to/local/a.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/b.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/c.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/d.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/e.js' UPLOAD_ADDRESS curl -F 'data=@path/to/local/f.js' UPLOAD_ADDRESS # ... import {uploadFilesToKakaoCDN} from '@commerce-ui/deploy-toolkit' (async () => { const cdnUrl = await uploadFilesToKakaoCDN({ path: 'dist/' }); })();