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

#angular #angular-reactive-forms #angular-validation #angular-validator

#angular #angular-reactive-forms #angular-validation #angular-validator

Вопрос:

Я использую angular 7 с компонентами material design

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

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

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

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

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

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

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

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

Комментарии:

1. Можете ли вы предоставить stackblitz/

2. И также вопрос не ясен —) Просто опишите , что вы хотите? и что в настоящее время не работает

3. Все работает нормально: stackblitz.com/edit/angular-9nggzx

4. Я думаю, вам нужно использовать при изменении «this.accessCodeList», this.stepFormGroup.get('AccessCode').setValidators([Validators.required, this.requireMatch(this.accessCodeList)])

5. Вот рабочее решение: stackblitz.com/edit/angular-9nggzx

Ответ №1:

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

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

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

Комментарии:

1. Это обеспечивает способ доступа ко всем параметрам компонента. Спасибо, чувак!

2. Как ни странно, моя переданная переменная остается нулевой.

Ответ №2:

Чтобы ваш валидатор функционировал с последним значением в контроллере, вы можете передать его как функцию и разрешить, когда это потребуется. таким образом, ваша функция проверки получит последнее или текущее значение.

Приведенный ниже код даст некоторое представление о моем ответе

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

//Validator Function
requireMatch = (getAccessCodes: (() => string[])) => {
    return (control: FormControl) => {
        const selection: any = control.value;
        const accessCodes = getAccessCodes();
        console.log("accessCodes", accessCodes, "selection", selection);
        if (accessCodes.indexOf(selection)===-1) {
            return { requireMatch: true };
        }
        return null;
    }
}
  

Ответ №3:

Согласно моему предположению, вы хотите сравнить пользовательский ввод со строковым массивом с помощью 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

Комментарии:

1. Я думаю, что проблема в том, что Анкур хочет изменить accessCodeList ПОСЛЕ создания формы. Поэтому он должен использовать setValidators

2. @Eliseo Да, может быть! Спросил его о разъяснении, но он не ответил

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

4. @AnkurAkvaliya Пожалуйста, отредактируйте вопрос и укажите свои требования