2016-11-30 38 views
7

我想創建一個條件需要驗證的特定field.I嘗試通過返回Validators.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

我解決了類似的問題,如下所示的可重用自定義驗證器:[條件必需](http:// stackoverflow。 com/questions/38204812/angular2-forms-validator-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]); 
}