Angular2 FormBuilder Validatiors:要求填充组中的至少一个字段

Man*_*nny 21 validation formbuilder angular

我有一个表格,我正在收集电话号码(手机,个人,其他).我需要至少填充输入.我正在尝试使用Angular2 FormBuilder.

经过大量研究后,我遇到了解决这个问题的问题.我知道我可以使用其他方法来做到这一点,但我想知道是否可以使用FormBuilder验证器.如果我添加"Validators.required",那么所有3个字段都是必需的.有什么建议或想法吗?

phone: this._fb.group(
                    {
                        other: [''],
                        personal: [''],
                        mobile: [''],
                    }
Run Code Online (Sandbox Code Playgroud)

根据"JB Nizet"的提示,这是我必须实现的工作:

我的组Validator(它仍然需要调整):

static phoneExists(group: FormGroup): { [key: string]: any } {

    if (null != group) {
        var other: AbstractControl = group.controls['other'];
        var mobile: AbstractControl = group.controls['mobile'];
        var personal: AbstractControl = group.controls['personal'];
        var data: Object = group.value;

        return (
            (other.valid && isEmptyInputValue(other.value))
            && (mobile.valid && isEmptyInputValue(mobile.value))
            && (personal.valid && isEmptyInputValue(personal.value))
            )
            ? { 'required': true }
            : null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的小组改变了:

phone: this._fb.group(
                    {
                        other: [''],
                        personal: [''],
                        mobile: [''],
                    },
                    { validator: MyValidators.phoneExists }
                )
Run Code Online (Sandbox Code Playgroud)

我花了一段时间,但关键是要添加关键词"验证器",它将导致组验证器触发.

在HTML中我添加了以下内容:

<small *ngIf="!myForm.controls.profile.controls.phone.valid" class="text-danger">
                                        At least one phone is required.
                                    </small>
Run Code Online (Sandbox Code Playgroud)

我希望这有助于其他任何人.

Mer*_*ott 27

我使用一个atLeastOne函数,根据任何现有的验证器创建自定义验证器:

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

export const atLeastOne = (validator: ValidatorFn) => (
  group: FormGroup,
): ValidationErrors | null => {
  const hasAtLeastOne =
    group &&
    group.controls &&
    Object.keys(group.controls).some(k => !validator(group.controls[k]));

  return hasAtLeastOne ? null : { atLeastOne: true };
};
Run Code Online (Sandbox Code Playgroud)

美丽的是你可以使用任何验证器,而不仅仅是Validators.required.

在OP的情况下,它将像这样使用:

{
  phone: this._fb.group({
    other: [''],
    personal: [''],
    mobile: [''],
  }, { validator: atLeastOne(Validators.required) })
}
Run Code Online (Sandbox Code Playgroud)

  • 纯天才,我喜欢它!感谢分享:) ...虽然什么是'ValidatorFn'和'ValidationErrors' - 我是否需要导入它们? (2认同)
  • 它们是`@ angular/forms`的一部分.编辑回答.别客气.很高兴它帮助:-) (2认同)

AnT*_*inE 8

这是一个可以与每个FormGroup一起使用的通用代码:

export function AtLeastOneFieldValidator(group: FormGroup): {[key: string]: any} {
  let isAtLeastOne = false;
  if (group && group.controls) {
    for (const control in group.controls) {
      if (group.controls.hasOwnProperty(control) && group.controls[control].valid && group.controls[control].value) {
        isAtLeastOne = true;
        break;
      }
    }
  }
  return isAtLeastOne ? null : { 'required': true };
}
Run Code Online (Sandbox Code Playgroud)

用法:

@Component({
  selector: 'app-customers',
  templateUrl: './customers.component.html',
  styleUrls: ['./customers.component.scss']
})
export class CustomersComponent implements OnInit {

  public searchCustomerForm: FormGroup;

  constructor() { }

  ngOnInit() {
    this.searchCustomerForm = new FormGroup({
      customerID: new FormControl(''),
      customerEmail: new FormControl(''),
      customerFirstName: new FormControl(''),
      customerLastName: new FormControl('')
    }, AtLeastOneFieldValidator);
  }
}
Run Code Online (Sandbox Code Playgroud)