如何在 angular 5 中验证表单数组中的电子邮件或 phone 字段?

How to validate email or phone fields in form array in angular 5?

我有两个字段
电子邮件 & Phone

它是多个字段。使用添加更多按钮添加新联系人所以我使用了 FormArray.

但重点是只有一个字段是必填的 email 或 phone
那么如何在FormArray中验证一个字段是必需的?

下面是我最新的代码。

this.form = this.fb.group({
     contact: this.fb.array([this.addNewContact()]),
});

public addNewContact() {
    return this.fb.group({
        department: [''],
        phone: [''],
        email: [
            '',
            Validators.compose([
                Validators.pattern(/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,15})$/)
            ])
        ],
    },
    this.emailOrPhone());
}

public emailOrPhone() {
    return (form: FormGroup): { [key: string]: any } => {
        console.log(form);
        return (!form.value.phone && !form.value.email) ? { isEmailOrMobile: true } : null;
    };
}

我已经完成了 angular 5.

您可能必须使用自定义验证器。

创建如下指令:

import {
    FormGroup,
    ValidationErrors,
    ValidatorFn,
    Validators,
  } from '@angular/forms';

  export const atLeastOne = (validator: ValidatorFn, controls:string[] = null) => (
    group: FormGroup,
  ): ValidationErrors | null => {
    if(!controls){
      controls = Object.keys(group.controls)
    }

    const hasAtLeastOne = group && group.controls && controls
      .some(k => !validator(group.controls[k]));

    return hasAtLeastOne ? null : {
      atLeastOne: true,
    };
  };

formBuilder 应如下所示:

return this.fb.group({
  department: [''],
        phone: [''],
        email: [
            '',
            Validators.compose([
                Validators.pattern(/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,15})$/)
            ])
        ],
}, { validator: atLeastOne(Validators.required, ['email','phone']) })

使用此指令,您可以检查它们是否有效。

这也可以重复用于任何其他形式。 这是验证器的示例工作示例: Working demo of atleast one validator

您可以根据自己的需要进行修改。

一种排序方法是,在其中一种形式中添加验证和更改,您可以禁用另一种形式,vice-versa。

public addNewContact() {
return this.fb.group({
    department: [''],
    phone: ['', Validators.compose([Validators.required])],
    email: [
        '',
        Validators.compose([Validators.required,
            Validators.pattern(/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,15})$/)
        ])
    ],
},

}

然后监控每个字段的变化并相应地删除验证

 this.form.get('phone').removeValidator('required');

this.form.get('email').removeValidator('required');