我正在try 显示Angular 的验证错误消息.我有三个复选框.如果我没有 Select 任何人,我想显示错误消息.如何在react 形式验证中以Angular 进行验证.

演示:https://stackblitz.com/edit/angular-gitter-ddqhne?file=app%2Fapp.component.html

App.Component.html:

    <form [formGroup]="formGroup">
    <label *ngFor="let val of data"><input type="checkbox" name="val.name" id="val.id" formControlName="cb"> {{val.value}}</label>
    <div style="color: red; padding-top: 0.2rem">
        Atleast select one checkbox
    </div>
    <hr>
    <div>
        <button type="submit">Submit</button>
    </div>
    </form>

App.Component.ts:

  ngOnInit(): void {
     this.formGroup = this.formBuilder.group({
        cb: [false, Validators.requiredTrue]
     });
  }

推荐答案

更新了我的答案,使用formControlName,其余的解释保持不变!但是我使用.bind(this, data)来传递*ngFor上使用的数据来初始化复选框,因为数据是动态的,所以我们需要传递原始数据来确保值被选中,以便至少选中一次复选框!

验证器

export function ValidateCheckboxes(data: any, control: AbstractControl) {
  console.log(data, control.value.cb);
  if (
    !data.some(
      (item: any, index: number) => control.value.cb[index][item.id]
    )
  ) {
    return { checkboxSectionValid: true };
  }
  return null;
}

stackblitz demo


我们可以为复选框使用formArray,这将确保输入在相同的formArray控制下

this.formGroup = this.formBuilder.group({
  cb: this.formBuilder.array([]),
});
const cb: FormArray = this.cbArray;
this.data.forEach((item: any) => {
  cb.push(new FormControl(null));
});

We need a custom 验证器 to check if any of the checkboxes are checked, we use the below code for that

this.formGroup.setValidators(ValidateCheckboxes);

验证器 function

export function ValidateCheckboxes(control: AbstractControl) {
  console.log(control.value.cb);
  if (!control.value.cb.some((item: any) => item)) {
    return { checkboxSectionValid: true };
  }
  return null;
}

在HTML端,我们将所有复选框分组到一个formGroupName下,然后将formArray控件分配给这些复选框.然后我们可以通过在错误消息div上执行*ngIf="formGroup?.errors?.checkboxSectionValid"来判断错误是否存在!

<div formArrayName="cb">
  <label *ngFor="let val of cbArray.controls; let i = index"
    ><input
      type="checkbox"
      name="{{ val.name }}"
      id="{{ val.id }}"
      [formControl]="val"
    />
    {{ data[i].value }}</label
  >
</div>
<div
  style="color: red; padding-top: 0.2rem"
  *ngIf="formGroup?.errors?.checkboxSectionValid"
>
  Atleast select one checkbox
</div>

完整代码

import { Component, OnInit, VERSION } from '@angular/core';
import {
  AbstractControl,
  FormBuilder,
  FormGroup,
  FormArray,
  FormControl,
} from '@angular/forms';

export function ValidateCheckboxes(control: AbstractControl) {
  console.log(control.value.cb);
  if (!control.value.cb.some((item: any) => item)) {
    return { checkboxSectionValid: true };
  }
  return null;
}

@Component({
  selector: 'app-root',
  templateUrl: './app.component.HTML',
})
export class AppComponent implements OnInit {
  formGroup: FormGroup;
  public data = [
    {
      name: 'chk1',
      id: 'chk1',
      value: 'Car',
    },
    {
      name: 'chk2',
      id: 'chk2',
      value: 'Bus',
    },
    {
      name: 'chk3',
      id: 'chk4',
      value: 'Motor',
    },
  ];

  constructor(private readonly formBuilder: FormBuilder) {}

  get cbArray() {
    return this.formGroup.get('cb') as FormArray;
  }

  ngOnInit(): void {
    this.formGroup = this.formBuilder.group({
      cb: this.formBuilder.array([]),
    });
    const cb: FormArray = this.cbArray;
    this.data.forEach((item: any) => {
      cb.push(new FormControl(null));
    });
    this.formGroup.setValidators(ValidateCheckboxes);
  }
}

HTML

<div style="padding: 1rem">
  <form [formGroup]="formGroup">
    <div formArrayName="cb">
      <label *ngFor="let val of cbArray.controls; let i = index"
        ><input
          type="checkbox"
          name="{{ val.name }}"
          id="{{ val.id }}"
          [formControl]="val"
        />
        {{ data[i].value }}</label
      >
    </div>
    <div
      style="color: red; padding-top: 0.2rem"
      *ngIf="formGroup?.errors?.checkboxSectionValid"
    >
      Atleast select one checkbox
    </div>
    <hr />
    <div>
      <button type="submit">Submit</button>
    </div>
  </form>
</div>

stackblitz demo

Typescript相关问答推荐

根据另一个成员推断类成员的类型

当使用`type B = A`时,B的类型显示为A.为什么当`type B = A时显示为`any `|用A代替?

无法将select选项的值设置为ngFor循环中的第一个元素

返回同时具有固定键和变量键的对象的函数的返回类型

隐式键入脚本键映射使用

具有泛型类型和缺省值的键

如何在Angular 12中创建DisplayBlock组件?

APIslice-CreateAPI的RTK打字错误

TS2339:类型{}上不存在属性消息

如何消除在Next.js中使用Reaction上下文的延迟?

对未到达受保护路由的路由环境做出react

为什么不能使用$EVENT接收字符串数组?

将对象的属性转换为正确类型和位置的函数参数

在打字脚本中对可迭代对象进行可变压缩

map 未显示控制台未显示任何错误@reaction-google-map/api

重写返回任何

我的类型谓词函数不能像我预期的那样工作.需要帮助了解原因

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?

TypeScript是否不知道其他函数内部的类型判断?

使用react+ts通过props传递数据