2016-11-30 3 views
7

특정 필드에서 조건부 필수 유효성 검사를 만들려고합니다.이 작업은 내 함수에서 다시 Validator.required로 수행하지만이 방법은 효과가없는 것 같습니다. 어떻게해야합니까? 내 코드는 다음과 같습니다.Angular2 : 조건부 필수 유효성 검사

private _ansat: AbstractControl = new FormControl('', Validators.required); 
private _helbred: AbstractControl = new FormControl('', Validators.compose([this.useValidateIfRadio(this._ansat, 0, Validators.required)])); 


constructor(private _fb: FormBuilder) { 
    this.myForm = this._fb.group({ 
      ansat: this._ansat, 
      helbred: this._helbred 
     }); 
} 

useValidateIfRadio (c: AbstractControl, n: number, v) { 
     return function (control) { 
      return new Promise(resolve => { 
      // this.msg = ansatControl.value; 
      console.log(v); 
       if (c.value === n) { 

        resolve(v); 
       } 
       else { 
        resolve(null); 

       } 
      }); 
     }; 
    }; 

모든 도움을 주시면 감사하겠습니다.

+0

당신이이 문제를 해결 했습니까? 나는 대답을 추가했고 당신이 같은 방식으로 (또는 더 나은 방법으로) 그것을 해결한다면 궁금하다. – Erex

+1

나는 다음과 같이 재사용 가능한 사용자 정의 검사기로 유사한 문제를 해결했다 : [Conditional Required] (http : // stackoverflow. co.kr/questions/38204812/angular2-forms-valid-with-interrelated-fields/40416197 # 40416197) –

+0

아, 천재적입니다! 나는 그 때 당신의 해결책을 시험 할 것이다! – Erex

답변

20

비슷한 문제가 있었지만 답변을 찾지 못했습니다. 아무도이 문제에 아직 답하지 않았으므로 내 문제를 어떻게 해결했는지, 그리고 동일한 해결책을 사용하여 문제를 해결할 수있는 방법을 보여줄 것입니다.

예 :

export class UserComponent implements OnInit { 

userForm: FormGroup; 

constructor(private fb: FormBuilder) {} 

ngOnInit() { 

    //Create my userForm and and add initial validators 
    this.userForm = this.fb.group({ 
     username: [null, [Validators.required]], 
     name: [null, [Validators.required]], 
     email: [], 
     phoneNumber: [null, [Validators.minLength(4)]], 
    }); 

    //Listen to email value and update validators of phoneNumber accordingly 
    this.userForm.get('email').valueChanges.subscribe(data => this.onEmailValueChanged(data)); 
} 


onEmailValueChanged(value: any){ 
    let phoneNumberControl = this.userForm.get('phoneNumber'); 

    // Using setValidators to add and remove validators. No better support for adding and removing validators to controller atm. 
    // See issue: https://github.com/angular/angular/issues/10567 
    if(!value){ 
     phoneNumberControl.setValidators([Validators.required, Validators.minLength(4)]); 
    }else { 
     phoneNumberControl.setValidators([Validators.minLength(4)]); 
    } 

    phoneNumberControl.updateValueAndValidity(); //Need to call this to trigger a update 
} 

} 

그래서 귀하의 경우에 당신은 ChangeListener를 추가해야합니다 (이메일 설정되지 않은 경우에만 전화 번호가 필요합니다)는 "_ansat"다음 내 이메일 리스너와 동일하고, 필요에 추가하려면 이에 따라 "_helbred".

2

그냥 필드에 대한 유효성 검사기를 추가

if(some_logic) { 
this.your_form.get('field_name').setValidators([Validators.required]); 
}