Angular2에서 양식 유효성 검사기를 트리거하는 방법


82

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']);
    }
});

아무도 해결책이 있습니까? 감사!


X 값을 기반으로 유효성 검사를 활성화 / 비활성화하려고합니까? 어떤 종류의 검증자를 사용하고 있습니까? 스코프의 조건에 따라 유효성 검사기가 실행되도록 할 수 있지만 그 방법이 효과가 있을지 확실하지 않습니다. 참조 : stackoverflow.com/questions/21370006/…
stephen.vakil

@ stephen.vakil-저는 angular2를 사용하고 있습니다.
Bonneville

@Bonneville 체크 박스 상태를 유효성 검사기 기능에 전달하는 방법을 설명해 주시겠습니까?
Varun Mulloli

답변:


79

여전히 답변을 찾고 있는지 모르겠으므로 여기에 제 제안이 있습니다.

이것을보세요 : 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 : 실제 구현에 대한 링크 변경, 문서에 대한 링크 추가

Validaton- 가이드

FormControl 문서


제안 해 주셔서 감사합니다 @Nightking, 시도해 보겠습니다. 링크가 작동하지 않습니다.
Bonneville 2015

@Bonneville 정보 주셔서 감사합니다. 그들은 양식 코드를 공통 네임 스페이스로 추출했습니다. 조금 빠르게 변하는 것 :). 소스에 대한 링크를 업데이트했습니다.
Nightking 2015

나는 마침내이 코드를 사용하게되었고 그것은 나를 위해 일하는 것 같습니다. 감사! BTW, 코드에 오타가 있습니다. updateValueAndValidity () 함수에 문자 'e'가 없습니다. 코드에 업데이트 대신 업데이트가 있습니다. 건배, 이것은 큰 도움이되었습니다!
Bonneville 2015

1
링크가 끊어졌습니다. 동일하지는 않지만 github.com/angular/angular/blob/master/packages/forms/src/… 로 업데이트 될 수 있습니다 . 또한 각도 문서에 링크 할 수
폭발 알약

1
생명의 은인 !! 내가 막힌 사용 사례는 사용자가 단일 양식 컨트롤을 건드리지 않고 양식을 제출할 때였습니다. 양식이 유효하지 않지만 오류 메시지가 표시되지 않는 컨트롤
pravin

43

내 ControlGroup을 사용하면 터치하면 오류 div가 확인되기 때문에 이렇게합니다.

for (var i in this.form.controls) {
  this.form.controls[i].markAsTouched();
}

(this.form은 내 ControlGroup입니다)


이것은 실제로 정답입니다. 단일 입력을 원하면 this.form.controls [ 'name']. markAsTouched ();
chris_r

19

이 블로그의 도움으로

블로그 링크

나는 Nightking 대답의 결합으로 해결책을 찾았습니다.

Object.keys(this.orderForm.controls).forEach(field => {
       const control = this.orderForm.get(field);
       control.updateValueAndValidity();

});

this.orderForm 은 양식 그룹입니다.



6

이 동작을 모델링하는 더 우아한 방법이 있습니다. 예를 들어 상태를 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
  });
}

0
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);
        }
    };
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.