angular2에서 다른 컨트롤이 변경 될 때 일부 컨트롤에 대해 Validator를 트리거하고 싶습니다. 양식을 재확인하도록 지시 할 수있는 방법이 있습니까? 더 나은 방법은 특정 필드의 유효성 검사를 요청할 수 있습니까?
예 : 확인란 X와 입력 P가 주어집니다. 입력 P에는 X의 모델 값에 따라 다르게 작동하는 유효성 검사기가 있습니다. X가 선택 / 선택 취소되면 P에서 유효성 검사기를 호출해야합니다. P의 유효성 검사기는 모델을 다음과 같이 살펴 봅니다. X의 상태를 결정하고 그에 따라 P의 유효성을 검사합니다.
다음은 몇 가지 코드입니다.
constructor(builder: FormBuilder) {
this.formData = { num: '', checkbox: false };
this.formGp = builder.group({
numberFld: [this.formData.num, myValidators.numericRange],
checkboxFld: [this.formData.checkbox],
});
}
this.formGp.controls['checkboxFld'].valueChanges.observer({
next: (value) => {
// I want to be able to do something like the following line:
this.formGp.controls['numberFld'].validator(this.formGp.controls['numberFld']);
}
});
아무도 해결책이 있습니까? 감사!
답변
여전히 답변을 찾고 있는지 모르겠으므로 여기에 제 제안이 있습니다.
이것을보세요 : Angular 2-AbstractControl
당신이 할 수있는 일은 다음과 같습니다.
this.formGp.controls['checkboxFld'].valueChanges.observer({
next: (value) => {
this.formGp.controls['numberFld'].updateValueAndValidity();
}
});
이것은 유효성 검사기를 트리거하고 실행해야합니다. 또한 상태도 업데이트됩니다. 이제 유효성 검사기 논리 내에서 확인란 값을 참조 할 수 있습니다.
도움이 되었기를 바랍니다!
편집 : 업데이트 된 링크 및 예제. 답변을 작성하는 동안 코드가 변경되었습니다.
EDIT_2 : alpha.48은 EventEmitter.observer를 EventEmitter.subscribe로 변경합니다!
EDIT_3 : 실제 구현에 대한 링크 변경, 문서에 대한 링크 추가
답변
내 ControlGroup을 사용하면 터치하면 오류 div가 확인되기 때문에 이렇게합니다.
for (var i in this.form.controls) {
this.form.controls[i].markAsTouched();
}
(this.form은 내 ControlGroup입니다)
답변
이 블로그의 도움으로
나는 Nightking 대답의 결합으로 해결책을 찾았습니다.
Object.keys(this.orderForm.controls).forEach(field => {
const control = this.orderForm.get(field);
control.updateValueAndValidity();
});
this.orderForm 은 양식 그룹입니다.
답변
이것은 나를 위해 트릭을했다
this.myForm.markAllAsTouched();
답변
이 동작을 모델링하는 더 우아한 방법이 있습니다. 예를 들어 상태를 ReplaySubject에 넣고이를 관찰 한 다음 상태를 관찰하는 비동기 유효성 검사기를 사용하는 것입니다.하지만 아래의 의사 코딩 방식이 작동합니다. 확인란에서 값 변경을 관찰하고 적절하게 모델을 업데이트 한 다음 updateValueAndValidity cal을 사용하여 numberFld의 재 검증을 강제 실행합니다.
constructor(builder: FormBuilder) {
this.formData = { num: '', checkbox: false };
const numberFld = builder.control(this.formData.num, myValidators.numericRange);
const checkbox = builder.control(this.formData.checkbox);
checkbox.valueChanges.map(mapToBoolean).subscribe((bool) => {
this.formData.checked = bool;
numberFld.updateValueAndValidity(); //triggers numberFld validation
});
this.formGp = builder.group({
numberFld: numberFld,
checkboxFld: checkbox
});
}
답변
static minMaxRange(min: number, max: number): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
if (Validators.min(min)(control)) { // if min not valid
return Validators.min(min)(control);
} else {
return Validators.max(max)(control);
}
};
}