Пользовательская проверка Angular 7 с динамическим / обновленным параметром
Я использую угловой 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 ответа
Вам нужно привязать функцию проверки, когда вы вызываете ее так, иначе функция проверки не будет привязывать входной accessList
[Validators.required, this.requireMatch(this.accessCodeList).bind(this)]
Также, если вы хотите ограничить какое-либо слово в поле, вы можете посмотреть один из моих пакетов npm здесь https://www.npmjs.com/package/ng4-validation
Чтобы ваша функция валидатора использовала последнее значение в контроллере, вы можете передать его как функцию и разрешить, когда это потребуется. поэтому ваша функция-валидатор получит последнее или текущее значение.
Код ниже даст некоторое представление о моем ответе
// 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;
}
}
Согласно моему предположению, вы хотите сравнить пользовательский ввод с массивом строк с 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