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) как валидатор для контроля формы.

Другие вопросы по тегам