Angular 2 跨域验证(基于模型)addErrors?
Angular 2 Cross Field Validation (model based) addErrors?
我正在为表单中的两个字段实施跨字段验证(基于反应/基于模型的方法)并且不知道我应该如何将错误添加到表单控件的现有错误列表中
表格:
this.myForm = new FormGroup({
name: new FormControl('', Validators.minLength(3));
city: new FormGroup({
cityOne: new FormControl('', Validators.minLength(3)),
cityTwo: new FormControl('', Validators.minLength(3))
}, this.validateEqualCities)
});
验证者:
validateEqualCities(formGroup: FormGroup) {
return (control: AbstractControl): { [key: string]: any } => {
if (formGroup.controls['cityOne'].value && formGroup.controls['cityTwo'].value && formGroup.controls['cityOne'].value !== formGroup.controls['cityTwo'].value) {
formGroup.controls['cityOne'].setErrors({ 'equalCities': true }, { emitEvent: true });
formGroup.controls['cityTwo'].setErrors({ 'equalCities': true }, { emitEvent: true });
return { 'equalCities': false };
} else {
formGroup.controls['cityOne'].updateValueAndValidity({ onlySelf: true, emitEvent: false });
formGroup.controls['cityTwo'].updateValueAndValidity({ onlySelf: true, emitEvent: false });
}
return null;
};
}
我的问题:
如果验证失败 "setErrors(..)" 覆盖所有已经存在的错误(formControls 的验证器),所以没有正确的状态,因为实际上应该有 2 个错误。
如果我不直接对表单控件设置错误,而只对表单设置错误return,则只有表单无效并收到错误,而不是它的控件。
如何实现表单和控件都具有真实的验证状态?
非常感谢!
您可以在分配错误之前捕获错误对象,修改它,然后写回整个对象。
validateEqualCities(formGroup: FormGroup) {
return (control: AbstractControl): { [key: string]: any } => {
if (formGroup.controls['cityOne'].value && formGroup.controls['cityTwo'].value && formGroup.controls['cityOne'].value !== formGroup.controls['cityTwo'].value) {
let errors = formGroup.controls['cityOne'].errors ? formGroup.controls['cityOne'].errors : {};
errors['equalCities'] = false;
formGroup.controls['cityOne'].setErrors(errors, { emitEvent: true });
errors = formGroup.controls['cityTwo'].errors ? formGroup.controls['cityTwo'].errors : {};
errors['equalCities'] = false;
formGroup.controls['cityTwo'].setErrors(errors, { emitEvent: true });
return { 'equalCities': false };
<...>
这是一个带有工作演示的 Plunker:http://plnkr.co/edit/XTeH1ifQTJSoMvBEvE0d?p=preview
我正在为表单中的两个字段实施跨字段验证(基于反应/基于模型的方法)并且不知道我应该如何将错误添加到表单控件的现有错误列表中
表格:
this.myForm = new FormGroup({
name: new FormControl('', Validators.minLength(3));
city: new FormGroup({
cityOne: new FormControl('', Validators.minLength(3)),
cityTwo: new FormControl('', Validators.minLength(3))
}, this.validateEqualCities)
});
验证者:
validateEqualCities(formGroup: FormGroup) {
return (control: AbstractControl): { [key: string]: any } => {
if (formGroup.controls['cityOne'].value && formGroup.controls['cityTwo'].value && formGroup.controls['cityOne'].value !== formGroup.controls['cityTwo'].value) {
formGroup.controls['cityOne'].setErrors({ 'equalCities': true }, { emitEvent: true });
formGroup.controls['cityTwo'].setErrors({ 'equalCities': true }, { emitEvent: true });
return { 'equalCities': false };
} else {
formGroup.controls['cityOne'].updateValueAndValidity({ onlySelf: true, emitEvent: false });
formGroup.controls['cityTwo'].updateValueAndValidity({ onlySelf: true, emitEvent: false });
}
return null;
};
}
我的问题: 如果验证失败 "setErrors(..)" 覆盖所有已经存在的错误(formControls 的验证器),所以没有正确的状态,因为实际上应该有 2 个错误。
如果我不直接对表单控件设置错误,而只对表单设置错误return,则只有表单无效并收到错误,而不是它的控件。
如何实现表单和控件都具有真实的验证状态?
非常感谢!
您可以在分配错误之前捕获错误对象,修改它,然后写回整个对象。
validateEqualCities(formGroup: FormGroup) {
return (control: AbstractControl): { [key: string]: any } => {
if (formGroup.controls['cityOne'].value && formGroup.controls['cityTwo'].value && formGroup.controls['cityOne'].value !== formGroup.controls['cityTwo'].value) {
let errors = formGroup.controls['cityOne'].errors ? formGroup.controls['cityOne'].errors : {};
errors['equalCities'] = false;
formGroup.controls['cityOne'].setErrors(errors, { emitEvent: true });
errors = formGroup.controls['cityTwo'].errors ? formGroup.controls['cityTwo'].errors : {};
errors['equalCities'] = false;
formGroup.controls['cityTwo'].setErrors(errors, { emitEvent: true });
return { 'equalCities': false };
<...>
这是一个带有工作演示的 Plunker:http://plnkr.co/edit/XTeH1ifQTJSoMvBEvE0d?p=preview