我如何压缩代码,在ReactiveFormsModule中定义验证对象和验证程序列表?

我如何压缩代码,在ReactiveFormsModule中定义验证对象和验证程序列表?,forms,angular,validation,typescript,angular-forms,Forms,Angular,Validation,Typescript,Angular Forms,我有基于ReactiveFormsModule的表单验证,如下所示。事实上,有相当多的被验证者,每个被验证者的列表都更长,尽管每个被验证者的列表基本相同 constructor(private builder: FormBuilder) { this.form = builder.group({ "firstName": ["", [Validators.required, Validators.minLength(3)]], "lastName": ["", [Valida

我有基于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)];
}