tap 연산자는 Observable을 디버깅 할 수 있도록 정확한 값이나, 다른 사이드 이팩트에 유용합니다.
Note: Observable의 측면에서 subscribe와는 다릅니다. 설령 subscribe하지 않은 Observable이 tap에 의해서 return되어도 , Observer에 의한 사이드 이팩트는 절대 발생하지 않습니다. tap은 단순히 존재하는 실행만 엿볼뿐, subscribe처럼 이벤트를 실행하지 않습니다.
물론 속성 값으로 [formControlName]="'username'" 를 사용해도 됩니다. string을 전달해야 하기 떄문에 ""안에 ''를 넣어야 합니다.
브라우저로 들어가 제대로 매칭이 되었는지 확인해 봅니다.
그림과 같이 ng-untouched와 같은 클래스가 있습니다.
개발 도구를 이용하면 ng로 시작하는 클래스가 있음으로, type스크립트가 작동한다는 것을 알 수 있습니다.
Validation 추가하기 - formControl 생성시 2번째 argu.에 추가합니다.
this.signupForm = new FormGroup({ //first: default Value, second: validation
'username': new FormControl(null, Validators.required),
'email': new FormControl(null, [Validators.required, Validators.email]),
'gender': new FormControl('male')
});
[]를 이용하여 복수의 validation을 추가합니다.
HTML에 안내 문 추가 하기
<span
*ngIf="!signupForm.get('username').valid && signupForm.get('username').touched"
>Please enter a valid username!</span>
signupForm 객체에 들어가 valid, touched와 같은 validation 값에 접근할 수 있습니다.
구릅핑 하기 - Form Group
ts파일에 userData로 그릅핑 하겠습니다. - nested Group
'userData': new FormGroup({
'username': new FormControl(null, Validators.required),
'email': new FormControl(null, [Validators.required, Validators.email])
}),
this.signupForm = new FormGroup({
'userData': new FormGroup({
'username': new FormControl(null, Validators.required),
'email': new FormControl(null, [Validators.required, Validators.email])
}),
'gender': new FormControl('male'),
'hobbies': new FormArray([])
});
hobbies라는 FormArray를 빈 상태로 추가합니다. - 취미가 없는 사람이 있을 수 있기 때문입니다.
<div formArrayName="hobbies">
<h4>Youre Hobbies</h4>
<button
class="btn btn-default"
type="button"
(click)="onAddHobby()">Add Hobby</button>
<div
class="form-group"
*ngFor="let hobbyContrl of signupForm.get('hobbies').controls; let i = index">
<input type="text" class="form-control" [formControlName]="i">
</div>
</div>
HTML에 formArrayName으로 바인딩 합니다.
onAddHobby라는 매쏘드로 사용자에게 반응합니다.
몇개의 취미가 있을지 모르기 때문에 ngFor을 이용하여 FormArray에 값을 추가합니다.