1

我不想要这个。因为我正在FormArray异步验证每个元素,所以我希望验证器仅在必要时运行(即,当它们添加到的控件的值真正改变时)。我也觉得这种行为很奇怪,因为验证器不会在值FormArray更改时执行,只有在添加新元素时才会执行。

复制:https ://stackblitz.com/edit/angular-reactive-forms-tkdu1n?file=app%2Fapp.component.ts

任何帮助将不胜感激

4

2 回答 2

1

当一个新的被推入其中时,它似乎FormArray为每个嵌套执行验证器,并且没有什么可做的......FormControlFormControl

所以我分叉了你的 stackblitz 并创建了一个带有闭包的有状态验证器,它成功了:

form: FormArray;

ngOnInit() {
  this.form = new FormArray([]);
  this.form.push(new FormControl("test", null, this.validatorFactory()));
}

addControl() {
  this.form.push(new FormControl(null, null, this.validatorFactory()));
}

validatorFactory() {
  let previousValue;
  return (c: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {
    if (c.value == previousValue) {
      return Observable.of(null);
    } else {
      previousValue = c.value;
      return Observable.of(null).delay(1000);
    }
  };
}

分叉的 Stackblitz

希望这可以帮助!

于 2018-07-06T15:09:49.843 回答
0

是的,只需更改

return Observable.of(null).delay(1000);

return Observable.of(null).delay(0);

当您将延迟设为 1000 毫秒时,您还会禁用并阻止其他实例(或值)的状态的可达性,但是,当您将延迟设为 0 时,它不会处理其他实例,只会检查当前实例。

希望能帮助到你!

于 2018-07-03T12:41:58.497 回答