2016-11-30 67 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]); 
}