首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >名称重复验证

名称重复验证
EN

Stack Overflow用户
提问于 2022-07-31 02:25:39
回答 1查看 199关注 0票数 1

我试图通过以下方式进行自定义验证,以便当在ts中定义的对象数组的输入中输入一个重复的名称时,应该会出现名称已经存在于mat错误中的消息。

这是我的html,在这里我用name字段实现表单,其中有两个mat错误,一个表示它是必需的,另一个表示名称已经存在,我将非常感谢您的帮助。

app.html

代码语言:javascript
复制
<form [formGroup]="form">
  <div>
      <mat-form-field>
        <input
         matInput
         type="text"
         [formControl]="name"
         required
        />
        <mat-error *ngIf="name.hasError('required')">
          It´s required
        </mat-error>
        <mat-error *ngIf="name.hasError('validateName')">
          the name already exists
        </mat-error>
      </mat-form-field>
   </div>
</form>

这是我初始化表单并放置验证的ts。

app.ts

代码语言:javascript
复制
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, Validators, AbstractControl, ValidationErrors } from '@angular/forms';

@Component({
  selector: 'app-formulario',
  templateUrl: './component.html',
  styleUrls: ['./component.scss'],
})
export class AdminMaintainerFormsDialogComponent implements OnInit{
  public form: FormGroup;
  public name: AbstractControl;
  public totalStudents: any =
  [
    {
      name: "Sandro",
      rol: "student"
    },
    {
      name: "Paola",
      rol: "student"
    }
  ];

  constructor( private fb: FormBuilder) { }

  ngOnInit() {
    this.start();
  }

  start() {
    this.form = this.fb.group({
      name: ['', Validators.compose([Validators.required, this.validateName ])]
    });
  }

  private validateName(control: AbstractControl): ValidationErrors | null {
    const names = this.totalStudents;
    let compareName;

    names.map(value => {
      compareName = value.name;
    })

    return compareName.test(control.value) ? null : {
      validateName: {
        valid: false
      }
    };
  }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-31 05:23:26

我认为您无法在totalStudents方法中检索validateName值。

您需要实现一个ValidatorFn方法来传递totalStudents

代码语言:javascript
复制
uniqueNameValidation(names: string[]): ValidatorFn {
  return (control: AbstractControl): ValidationErrors | null => {
    return !names.find((x) => x == control.value)
      ? null
      : {
          validateName: {
            valid: false,
          },
        };
  };
}

对于表单组,只通过与totalStudents映射传递name

代码语言:javascript
复制
this.form = this.fb.group({
  name: [
    '',
    Validators.compose([
      Validators.required,
      this.uniqueNameValidation(this.totalStudents.map((x) => x.name)),
    ]),
  ],
});

样本StackBlitz演示

附带说明:

代码语言:javascript
复制
Validators.compose([
  Validators.required,
  this.uniqueNameValidation(this.totalStudents.map((x) => x.name)),
]),

可替换为:

代码语言:javascript
复制
[
  Validators.required,
  this.uniqueNameValidation(this.totalStudents.map((x) => x.name)),
]

参考资料

具有角参数的自定义Validator

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73180287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档