Пользовательская проверка Angular 7 с динамическим / обновленным параметром - PullRequest
2 голосов
/ 21 марта 2019

Я использую угловой 7 с компонентами дизайна материала

У меня есть требование добавить проверку requireMatch в mat-autocomplete.

Я создал пользовательскую проверку с параметром, но значение параметра изменяется динамически.

Ниже приведен мой код компонента.

this.stepFormGroup = this.formBuilder.group({
    AccessCode: ["", [Validators.required, this.requireMatch(this.accessCodeList)]]
});

////require-match validation for access-code
requireMatch = (accessCodes: string[]) => {
    return (control: FormControl) => {
        const selection: any = control.value;
        console.log("accessCodes", accessCodes, "selection", selection);
        if (accessCodes.indexOf(selection)===-1) {
            return { requireMatch: true };
        }
        return null;
    }
}

Проблема, с которой я сталкиваюсь: я всегда получаю пустое значение (init) в accessCodes внутри requireMatch.

Изменения this.accessCodeList не отражаются в валидаторе.

То есть после изменения this.accessCodeList он не получает обновленный массив в requireMatch валидаторе.

Так, у кого-нибудь есть идеи о том, как передать динамический параметр в custom-validator?

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Вам нужно привязать функцию проверки при ее вызове следующим образом: в противном случае функция проверки не будет привязывать входной список доступа

[Validators.required, this.requireMatch(this.accessCodeList).bind(this)]

Также, если вы хотите ограничить какое-либо слово в поле, вы можете посмотретьодин из моих пакетов npm здесь https://www.npmjs.com/package/ng4-validation

1 голос
/ 21 марта 2019

Согласно моему предположению, вы хотите сравнить ввод пользователя с массивом строк с помощью FormControl.Таким образом, вы можете получить индекс предмета и проверить, не равен ли он -1, например:

var index = accessCodes.indexOf(selection);
if (index != -1) { // That means item found in the array
  console.log('if')
  return { requireMatch: true };
}
else {
  // console.log('esle')
  return null;
}

Код TS:

import { Component, Inject, OnInit } from '@angular/core';
import {
  FormBuilder,
  FormControl,
  FormGroup,
  Validators,
} from '@angular/forms';

@Component({
  selector: 'select-multiple-example',
  templateUrl: 'select-multiple-example.html',
  styleUrls: ['select-multiple-example.css'],
})
export class SelectMultipleExample implements OnInit {
  public stepFormGroup: FormGroup;
  accessCodeList: any[] = ['Prashant', 'Pimpale'];

  constructor(private fb: FormBuilder) {

  }

  public ngOnInit(): void {
    this.stepFormGroup = this.fb.group({
      AccessCode: ["", [Validators.required, this.requireMatch(this.accessCodeList)]]
    });
  }

  ////require-match validation for access-code
  requireMatch = (accessCodes: string[]) => {
    return (control: FormControl) => {
      const selection: any = control.value;

      console.log("accessCodes", accessCodes, "selection", selection);
      var index = accessCodes.indexOf(selection);
      if (index != -1) {
        console.log('if')
        return { requireMatch: true };
      }
      else {
        // console.log('else')
        return null;
      }
      return null;
    }
  }
}

Код HTML:

<input [formControl]="stepFormGroup.get('AccessCode')">

StackBlitz

...