Как проверить контрольное значение реактивной формы (Model Driven Form), является ли оно дублированием существующего значения в angular2?

У меня есть список названий команд, которые я получаю от службы. При создании новой команды с использованием реактивной формы я хочу добавить настраиваемый валидатор в текстовое поле teamName, чтобы проверить, существует ли это имя или нет. Может кто-нибудь, пожалуйста, дайте мне знать, как это сделать? Возможно ли добавить валидатор в этом случае?

1 ответ

Вот простой пример того, как это можно сделать. Ниже находится app.component.ts

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormControl } from '@angular/forms';
import { CustomValidator } from './custom-validators';

const prevNames = ['hector', 'steve', 'adam', 'peter'];

@Component({
  selector: 'app-root',
  template: `
   <div [formGroup]="newName">
     <input formControlName="newName">
   </div>`,
  styleUrls: [`./app.component.css`]
  })
export class AppComponent implements OnInit {
  newName: FormGroup;
  constructor(private fb: FormBuilder) { }
  ngOnInit() {
    this.newName = this.fb.group({
      newName: this.fb.control('',CustomValidator.checkNamesMatched(prevNames))
    });
  } // End Of Init
} // End of Class

Ваш валидатор входит в качестве второго аргумента в контроле формы и вставляет массив имен в качестве аргумента валидатора. Предполагая, что у вас есть список имен в массиве. Ниже находится custom-validators.ts

export class CustomValidator {
static checkNamesMatched(arrayOfNames: string[]) {
    return (control) => {
        let matched = false;
        arrayOfNames.forEach((value) => {
            if (value.toLowerCase().trim() === control.value.toLowerCase().trim()) {
                return matched = true;
            }
        });
        return (!matched) ? null : { checkNamesMatched: true };
    };
  } // End of method
} // End of Class

ваш валидатор будет проходить через каждый элемент arrayOfNames (а также в нижнем регистре и удалять пробелы с обоих концов для точного сравнения) и проверять, равно ли оно значению в элементе управления. Если ни один из них не соответствует, он вернет ноль (что означает отсутствие ошибок), в противном случае сообщая о совпадении (что приведет к ошибке). Убедитесь, что вы делаете весь необходимый импорт в компоненте и модуле. Надеюсь, поможет! Ниже представлен app.module на всякий случай.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';

@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Другие вопросы по тегам