ng2-validation объединенная проверка телефонов США и Канады? - PullRequest
0 голосов
/ 13 февраля 2019

Я использую ng2-validation , который использует libphonenumber-js для проверки телефонных номеров.Я хотел бы разрешить номера телефонов в США и Канаде в форме управления номерами телефонов.В настоящее время я передаю CustomValidators.phone('US') как средство проверки формы, которое разрешает номера телефонов в США, но запрещает номера телефонов Канады.

Можно ли с помощью этого метода проверки разрешить номера телефонов США и Канады в элементе управления формой?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я создал новый файл 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) в качестве валидатора для элемента управления формы.

0 голосов
/ 13 февраля 2019

Глядя на исходный код из используемой вами функции валидатора:

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')
...