Angular 2 跨字段验证(基于模型)addErrors?

use*_*019 3 forms validation form-control angular

我正在对表单中的两个字段实施跨字段验证(基于反应/模型的方法),并且不知道应该如何将错误添加到表单控件的现有错误列表中

形式:

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)
});
Run Code Online (Sandbox Code Playgroud)

验证器:

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;
    };
  }
Run Code Online (Sandbox Code Playgroud)

我的问题:如果验证失败,“setErrors(..)”会覆盖已经存在的所有错误(formControls 的验证器),因此没有正确的状态,因为实际上应该有 2 个错误。

如果我不直接向表单控件设置错误,而仅向表单返回错误,则只有表单无效并收到错误,而不是其控件。

如何才能使表单和控件都具有真实的验证状态?

非常感谢!

sil*_*sod 5

您可以在分配错误、修改错误并将整个对象写回之前捕获错误对象。

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 };
    <...>
Run Code Online (Sandbox Code Playgroud)

这是一个带有工作演示的 Plunker:http://plnkr.co/edit/XTeH1ifQTJSoMvBEvE0d ?p=preview