ng2-validation объединенная проверка телефонов США и Канады?
Я использую ng2-validation, которая использует libphonenumber-js для проверки телефонных номеров. Я хотел бы разрешить номера телефонов в США и Канаде в форме управления номерами телефонов. Я сейчас прохожу CustomValidators.phone('US')
как средство проверки формы, которое разрешает использование телефонных номеров в США, но запрещает использование канадских телефонных номеров.
Есть ли способ, позволяющий использовать как американские, так и канадские телефонные номера в элементе управления формы с помощью этого метода проверки?
2 ответа
Глядя на исходный код из функции валидатора, которую вы используете:
export const phone = (country: string): ValidatorFn => {
return (control: AbstractControl): { [key: string]: boolean } => {
if (isPresent(Validators.required(control))) return null;
let v: string = control.value;
return isValidNumber({phone: v, country}) ? null : {phone: true};
};
};
Вы должны быть в состоянии объединить их самостоятельно с или или (что-то вроде этого):
export const phone = (countries: string[]): ValidatorFn => {
return (control: AbstractControl): { [key: string]: boolean } => {
if (isPresent(Validators.required(control))) return null;
let v: string = control.value;
const validPhone: boolean = countries.map(c => isValidNumber({phone: v, c}).some(z => z);
return validPhone ? null : {phone: true};
};
};
Затем внутри вашего валидатора вы можете передать список кодов стран:
phone('US', 'CAN')
Я сделал новый файл customPhoneValidator.ts
содержащий следующее:
import { AbstractControl, ValidatorFn } from '@angular/forms';
import { isValidNumber, NationalNumber, CountryCode } from 'libphonenumber-js';
export const customPhoneValidator = (countries: CountryCode[]): ValidatorFn => {
return (control: AbstractControl): { [key: string]: boolean } => {
let v: NationalNumber = control.value;
if (!v || v === '') return null;
const validPhone: boolean = countries.map(c => isValidNumber(v, c)).some(z => z);
return validPhone ? null : { phone: true };
};
};
В компоненте, который использует валидатор, я объявил const customPhoneCountries: CountryCode[] = ['US', 'CA'];
и прошел customPhoneValidator(customPhoneCountries)
как валидатор для контроля формы.