ilo*_*aAJ 6 typescript angular
我可以有条件地实现Angular 2反应形式的验证.我有这个带有3个formControl字段的反应形式,一个是选择,另外两个是名字和姓氏的输入文本.我想根据第一个字段"validateBy"的选择有条件地实现firstname和lastname的验证.如果用户选择'byFirstName',则只应验证firstName.如果用户选择'byLastName',则只应验证lastName.如果用户选择'byBoth',则应验证firstName和lastName.我为此创造了一个plunker.只有两个验证工作.
ngOnInit() {
this.myForm = this._fb.group({
validateBy: ['byFirstName'],
firstName: ['', isFirstNameValid(() => (this.validateBy === 'byFirstName' || this.validateBy === 'byBoth'),
Validators.required)],
lastName: ['', isLastNameValid(() => (this.validateBy === 'byLastName' || this.validateBy === 'byBoth'),
Validators.required)],
});
Run Code Online (Sandbox Code Playgroud)
stt*_*106 10
另一种方法是这样的.似乎对plunker工作
ngOnInit() {
this.myForm = this._fb.group({
validateBy: ['byFirstName'],
firstName: [''],
lastName: [''],
});
this.myForm.get('validateBy').valueChanges.subscribe(
(validateBy : string) => {
if (validateBy === 'byFirstName' || validateBy === 'byBoth') {
this.myForm.get('firstName').setValidators([Validators.required]);
this.myForm.get('firstName').updateValueAndValidity();
}
if (validateBy === 'byLastName' || validateBy == 'byBoth') {
this.myForm.get('lastName').setValidators([Validators.required]);
this.myForm.get('lastName').updateValueAndValidity();
}
};
)
}
Run Code Online (Sandbox Code Playgroud)
问题是你的代码只计算表达式一次 - FormGroup创建时.您需要通过创建自定义验证器使其动态化,该验证器将在每次调用时评估表达式:
this.personForm= this.fb.group({
firstName: ['', Validators.required];
lastName: [
'',
conditionalValidator(
(() => this.isValidationForLastName === true),
Validators.required
)
]
});
function conditionalValidator(condition: (() => boolean), validator: ValidatorFn): ValidatorFn {
return (control: AbstractControl): {[key: string]: any} => {
if (! condition()) {
return null;
}
return validator(control);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6934 次 |
| 最近记录: |