如何在 Angular 的 ReactiveFormsModule 中压缩定义验证者和验证器列表的代码?

How can I compact the code defining the list of validatees and validators in ReactiveFormsModule of Angular?

我有基于 ReactiveFormsModule 的表单验证,如下所示。实际上,有更多的验证者并且每个验证者的列表更长(尽管每个基本相同)。

constructor(private builder: FormBuilder) {
  this.form = builder.group({
    "firstName": ["", [Validators.required, Validators.minLength(3)]],
    "lastName": ["", [Validators.required, Validators.minLength(3)]]
  });
}

它太冗长了,这让我很困扰,我想知道是否有一种巧妙的方法可以将所有验证器粉碎在一起,并以某种方式让它成为一个单一的实例。

如果您的字段确实有相同的验证器,您可以只使用一个数组作为您的键并像这样减少它:

const fields=["firstName","lastName"]
let myGroup = fields.reduce((group,field)=>{
  return group[field]=["",[Validators.required,Validators.minLength(3)]]
},{} as {[k:string]:any});

this.form = builder.group(myGroup);

如果某些字段有不同的验证器,您甚至可以在之后设置:

this.form.get("myField").setValidators([someValidator]);

但请注意,恕我直言,您失去了可读性。

在我看来,您有两个方面的麻烦 - 要验证的字段集(垂直大小)和验证集(水平大小)?虽然 @n00dl3 讨论(并批评)两个维度的切割,但我强烈建议您只在后者(即水平方向)上工作。

constructor(private builder: FormBuilder) {
  const validation = [Validators.required, Validators.minLength(3)];
  this.form = builder.group({
    "firstName": ["", validation],
    "lastName": ["", validation]
  });
}

此外,我怀疑您会达到需要参数化验证的地步。在这种情况下,您可能会考虑切换到一个可以进行适当验证的函数。

constructor(private builder: FormBuilder) {
  this.form = builder.group({
    "firstName": ["", validation(1)],
    "lastName": ["", validation(2)]
  });
}

validation(type: number) : Validations {
  if(type === 1)
    return [Validations.required];
  return [Validators.required, Validators.minLength(3)];
}