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

Fundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptxFundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptx
manasideore6
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
AmarGB2
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
Robbie Edward Sayers
 
AP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specificAP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specific
BrazilAccount1
 
DESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docxDESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docx
FluxPrime1
 
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
obonagu
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
MLILAB
 
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
 
block diagram and signal flow graph representation
block diagram and signal flow graph representationblock diagram and signal flow graph representation
block diagram and signal flow graph representation
Divya Somashekar
 
ethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.pptethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.ppt
Jayaprasanna4
 
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&BDesign and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Sreedhar Chowdam
 
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
Amil Baba Dawood bangali
 
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptxCFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
R&R Consult
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
TeeVichai
 
WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234
AafreenAbuthahir2
 
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
 
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
bakpo1
 
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
 
Hierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power SystemHierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power System
Kerry Sado
 
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdfGoverning Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
WENKENLI1
 

Recently uploaded (20)

Fundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptxFundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptx
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
 
AP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specificAP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specific
 
DESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docxDESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docx
 
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
 
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
 
block diagram and signal flow graph representation
block diagram and signal flow graph representationblock diagram and signal flow graph representation
block diagram and signal flow graph representation
 
ethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.pptethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.ppt
 
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&BDesign and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
 
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
 
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptxCFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
 
WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234
 
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
 
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
 
Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024
 
Hierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power SystemHierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power System
 
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdfGoverning Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.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/' }); })();