Пользовательский валидатор Angular:
Пользовательский валидатор, который я использую сейчас:
static digitOnly(digit: string): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
const restrict = [];
for (let i = 0; i < parseInt(digit); i++) {
restrict.push('0');
}
const val = control.value;
if (val === null || val === '') {
return null;
}
if (restrict.toString().replace(/,/g,'') === val.toString()) {
return { 'invalidNumber': true };
}
const pattern = new RegExp(`^[0-9]{${digit}}$`);
if (!val.toString().match(pattern)) {
return { 'invalidNumber': true };
}
return null;
}
}
Описание:
Я хочу добавить настраиваемый валидатор в поле ввода, которое принимает GPA, требование: введенное значение не может быть больше 400 или пусто или 0 или 1
прямо сейчас: мой пользовательский валидатор работает для следующих условий: проверка 000 как недопустимая, что является правильным, проверка 0 или 1 или числовой отдельной цифры как недопустимые, что является правильным
Единственная проблема в том, что он принимает значения выше 400
с нетерпением жду быстрой помощи.
1 ответ
import { Directive } from '@angular/core';
import { AbstractControl, NG_VALIDATORS, Validator } from '@angular/forms';
@Directive({
selector: '[forbidden]',
providers: [
{
provide: NG_VALIDATORS,
useExisting: ForbiddenValidator,
multi: true
}
]
})
export class ForbiddenValidator implements Validator {
/**
* Verify if the value it is allowed or not
* @param control form control which is evaluated
*/
validate(control: AbstractControl): { [key: string]: any } | null {
if (control.value.length < 3 || control.value === '')
return { 'forbidden': true };
let num = parseInt(control.value);
return num > 400 ? { 'forbidden': true } : null;
}
}
Это будет ваша настраиваемая директива валидатора, тогда в вашем шаблоне:
<form #form="ngForm">
<input nz-input id="property" name="property" [(ngModel)]="someVariable
(ngModelChange)="onChange()" forbidden #property="ngModel">
<div *ngIf="property.invalid && property.errors.forbidden>
Invalid value
</div>
</form>