angular - Nimen kaksoiskappaleen vahvistus


Yritän seuraavalla tavalla mukautettua validointia, jotta kun syötetty nimi on jo olemassa ts:ssä määritellyssä objektitaulukossa, viestin siitä, että nimi on jo olemassa, tulisi näkyviin mat-errorissa

Tämä on minun HTML:ni, jossa toteutan lomakkeen nimikentällä, jossa on 2 mat-virhettä, joista toinen ilmaisee, että se on pakollinen, ja toinen ilmaisee, että nimi on jo olemassa, arvostaisin suuresti apuasi

app.html

<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>

Tämä on ts, jossa alustaan lomake ja laitan validoinnit

app.ts

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
      }
    };
  }

}

Vastaus #1

Uskon, ettet pysty hakemaan totalStudents-arvoa validateName-metodissa.

Sinun täytyy toteuttaa ValidatorFn-metodi hyväksyäksesi totalStudents.

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

Lomake-ryhmälle lähetä totalStudents yhdistämällä vain name.

this.form = this.fb.group({
  name: [
    '',
    Validators.compose([
      Validators.required,
      this.uniqueNameValidation(this.totalStudents.map((x) => x.name)),
    ]),
  ],
});

Esimerkkikuva StackBlitzistä


Sivuhuomautus:

Validators.compose([
  Validators.required,
  this.uniqueNameValidation(this.totalStudents.map((x) => x.name)),
]),

voidaan korvata seuraavalla:

[
  Validators.required,
  this.uniqueNameValidation(this.totalStudents.map((x) => x.name)),
]

Viitteet

Mukautettu validointiominaisuus parametreilla Angularissa