在角反应形式验证器中使用google-libphonenumber

Ati*_*ris 2 typescript libphonenumber angular-validation angular angular-reactive-forms

这是使用此库的基本用例。我需要验证该号码是否有效。我使用角度反应形式 自定义验证器
验证程序在文件中:validators/phone-number.validator.ts
第一步是获取google-libphonenumber PhoneNumberUtil实例

我的代码的当前状态是:

import { ValidatorFn, AbstractControl } from '@angular/forms';
import phoneUtil = require('google-libphonenumber');
const phoneUtilInstance = phoneUtil.PhoneNumberUtil.getInstance();

export function PhoneNumberValidator(): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } => {
    if (!phoneUtilInstance.isValidNumber(control.value)) {
      return { 'wrongNumber': { value: control.value } };
    }
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

以反应形式使用(file contact.component.ts):

import { PhoneNumberValidator } from '@app/validators';
...
ngOnInit(): void { ...
this.editPhoneForm = this.formBuilder.group({
  id: [''],
  phone: ['', [
    Validators.minLength(3),
    PhoneNumberValidator()
  ]],
}); ...
Run Code Online (Sandbox Code Playgroud)

可以构建和执行此代码,但是在启动后,我得到:

ERROR TypeError: a.getCountryCodeOrDefault is not a function
at i18n.phonenumbers.PhoneNumberUtil.getRegionCodeForNumber (VM145038 libphonenumber.js:4418)
Run Code Online (Sandbox Code Playgroud)

如何在Angular项目中正确使用此库作为验证器?

声明
此问题类似于如何在Typescript中使用Google libphonenumber?但在这种情况下,它专门与Angular项目有关。

Ati*_*ris 5

我目前找到了一个解决方案:

  1. 您需要google-libphonenumber并为其输入类型:
    npm install --save google-libphonenumber
    npm install --save-dev @types/google-libphonenumber

  2. 导入PhoneNumberUtil, PhoneNumber到你的validator文件(全文):

import { ValidatorFn, AbstractControl } from '@angular/forms';
import { PhoneNumberUtil, PhoneNumber } from 'google-libphonenumber';

const phoneNumberUtil = PhoneNumberUtil.getInstance();

export function PhoneNumberValidator(regionCode: string = undefined): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } => {
    let validNumber = false;
    try {
      const phoneNumber = phoneNumberUtil.parseAndKeepRawInput(
        control.value, regionCode
      );
      validNumber = phoneNumberUtil.isValidNumber(phoneNumber);
    } catch (e) { }

    return validNumber ? null : { 'wrongNumber': { value: control.value } };
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用PhoneNumberValidator与您的默认区域代码(代码部分)反应形式:
import { PhoneNumberValidator } from '@app/validators';
...
ngOnInit(): void { ...
this.editPhoneForm = this.formBuilder.group({
  id: [''],
  phone: ['', [
    PhoneNumberValidator('US')
  ]],
}); ...
Run Code Online (Sandbox Code Playgroud)

  • 你能在代码演示中演示这一点吗——stackblitz (2认同)