【问题标题】:(Angular2/4/5/6) How to validate length of international phone numbers according to country(Angular2/4/5/6) 如何根据国家/地区验证国际电话号码的长度
【发布时间】:2019-06-14 11:08:48
【问题描述】:

是否有可用于单独验证国际手机号码的图书馆/服务类?例如。新加坡手机号码必须有 8 位,中国必须有 11 位等。目前我正在使用反应式格式的 ng4-intl-phone 来允许用户输入他们的手机号码。

验证应该根据每个国家/地区出现,而不是对国际电话号码进行一般检查,例如号码是 3 到 14 位数字(这是我以前使用的)。

感谢您的帮助!

更新

我暂时使用https://www.npmjs.com/package/ngx-international-phone-number。如果有人需要使用它们作为参考,我仍然会在下面留下这些答案!

【问题讨论】:

  • 我在几个项目中成功使用了smoshysmosh.github.io/ng-intl-tel-input。希望它能解决你的问题。如果您需要,我可以提供一些示例代码。
  • 嘿 Janith,感谢您的帮助,但我正在寻找 angular 2/4/5/6 解决方案.. 你碰巧有示例代码吗?谢谢!!
  • 请检查我的回答。如果它解决了您的问题,请将其标记为答案并投票给我;)

标签: angular validation angular6 phone-number


【解决方案1】:

这是我的自定义解决方案。它适用于我的解决方案。

请在您的项目中安装 intl-tel-input

npm i intl-tel-input --save

然后创建一个IntlTelInputComponent组件如下。

intl-tel-input.component.ts

import {
  AfterViewInit, Component, ElementRef, EventEmitter, Input, Output, ViewChild, forwardRef, Renderer
} from '@angular/core';
import 'intl-tel-input';
import * as jQuery from 'jquery';
import { NG_VALUE_ACCESSOR, ControlValueAccessor, } from '@angular/forms';

export interface ITimeInputFieldChanged {
  value: string;
  extension: string;
  numberType: string,
  valid: boolean;
  validationError: any
}

export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => IntlTelInputComponent),
  multi: true
};

const noop = () => {
};

@Component({
  selector: 'intl-tel-input',
  templateUrl: './intl-tel-input.component.html',
  styleUrls: ['./intl-tel-input.component.scss'],
  providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})

export class IntlTelInputComponent implements ControlValueAccessor {

  @Input() fullValue: string;
  @Output() fullValueChange = new EventEmitter<ITimeInputFieldChanged>();
  @Input() id: string;
  @Input() intlOptions = {
    initialCountry: 'no',
    formatOnDisplay: true,
    separateDialCode: true,
    onlyCountries: ['no', 'be']
  };
  @Input() value: string;
  @Output() valueChange = new EventEmitter<string>();
  @Output() valueBlur = new EventEmitter<string>();
  @Output() valueFocus = new EventEmitter();
  @ViewChild('intlInput') intlInput: ElementRef;

  private extension: string;

  private onTouchedCallback: () => void = noop;
  private onChangeCallback: (_: any) => void = noop;

  constructor(
    private _renderer: Renderer) { }

  onInputChange(value: string) {
    const intlInput = jQuery(this.intlInput.nativeElement)
    this.value = value;
    this.valueChange.emit(value);
    this.fullValue = intlInput.intlTelInput('getNumber');
    this.extension = intlInput.intlTelInput('getSelectedCountryData').dialCode;
    const validationErrorCode = intlInput.intlTelInput('getValidationError');
    let validationMessage = 'VALID';
    switch (validationErrorCode) {
      case 1:
        validationMessage = 'INVALID_COUNTRY_CODE'
        break;
      case 2:
        validationMessage = 'TOO_SHORT'
        break;
      case 3:
        validationMessage = 'TOO_LONG'
        break;
      case 4:
        validationMessage = 'NOT_A_NUMBER'
        break;
      case 5:
        break;
      default:
        validationMessage = 'VALID'
        break;
    }
    this.fullValueChange.emit({
      value: value,
      extension: this.extension,
      numberType: intlInput.intlTelInput('getNumberType'),
      valid: intlInput.intlTelInput('isValidNumber'),
      validationError: validationMessage
    });
    // this.writeValue(this.fullValue);
  }

  onBlur(value: string) {
    this.valueBlur.emit(value);
  }

  onFocus() {
    this.valueFocus.emit();
  }

  writeValue(value: any): void {

    if (value && (value !== this.value)) {
      this.fullValue = value;
      setTimeout(() => {
        const phoneInput = jQuery(`input#${this.id}`);
        phoneInput.intlTelInput('setNumber', this.fullValue);
      }, 100);
    }
  }
  registerOnChange(fn: any): void {
    this.onChangeCallback = fn;
  }

  registerOnTouched(fn: () => any): void { this.onTouchedCallback = fn; }

  setDisabledState?(isDisabled: boolean): void {
    throw new Error('Method not implemented.');
  }

}

intl-tel-input.component.html

<input #intlInput class="form-control"
[appIntlTelInput]="intlOptions"
[id]="id"
[ngModel]="value"
(ngModelChange)="onInputChange($event)"
(blur)="onBlur($event)"
(focus)="onFocus()"
>

intl-tel-input.component.scss

:host /deep/.intl-tel-input{
    display: block;
    .country-list{
        overflow-y: auto;
    }
}

intl-tel-input.directive.ts

import { Directive, ElementRef, Input, OnInit } from '@angular/core';
import 'intl-tel-input';
import * as jQuery from 'jquery';

@Directive({
  selector: '[appIntlTelInput]'
})
export class IntlTelInputDirective implements OnInit {

  @Input('appIntlTelInput') appIntlTelInput: any;
  constructor(private el: ElementRef) { }

  ngOnInit() {
    // jQuery.fn.intlTelInput.loadUtils('https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/11.0.12/js/utils.js');
    // jQuery.fn.intlTelInput.loadUtils('/intl-tel-input/build/js/utils.js');
    jQuery.fn.intlTelInput.loadUtils('assets/js/utils.js');
    jQuery(this.el.nativeElement).intlTelInput(this.appIntlTelInput);
  }
}

在表单中使用

 <intl-tel-input formControlName="Mobile" ></intl-tel-input>

希望这能解决您的问题。它可以根据需要验证任何国际手机号码。

【讨论】:

  • 感谢您的回答!我会尽力解决并回复你:) 同时我会暂时支持这个。
  • 嘿,詹妮丝!我已根据角度要求将组件名称更新为 app-intl-tel-input。目前有一个错误说 appIntlTelInput 不存在..有什么想法吗?谢谢! :)
  • @iBlehhz 对不起,我错过了 intl-tel-input.directive.ts 文件。请检查更新后的代码。
  • @iBlehhz 这对解决您的要求没有帮助吗?
  • 抱歉,我在运行代码时遇到了问题,例如不支持 forwardRef,组件命名错误和 appIntlTelInput 仍未检测到,尽管我在 modules.ts 中导入了指令。意识到npmjs.com/package/ngx-international-phone-number-fix 对我来说效果更好,但是,感谢您的帮助! :)
【解决方案2】:

我在我的 Angular 6 项目中使用了libphonenumber-js,它工作得非常好。

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 2017-03-30
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2021-10-03
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多