【问题标题】:How to apply mask to a default value in Typescript如何将掩码应用于 Typescript 中的默认值
【发布时间】:2021-09-02 07:34:15
【问题描述】:

我有一个 mask-phone 指令,当用户写入一个值时,它在输入中完美工作,但我需要设置一个默认值,我不知道如何在组件方法中应用 mask 指令。该值在没有掩码的情况下显示在输入中,并且只有当我修改该值时,掩码才会出现。

我的问题是在德国有几种电话号码的可能性,所以我不能在默认值中设置特定的掩码,例如: (49)(170)-1111111 (49)(1514)-1111111 (49)(25679)-1111111

我写了一个例子,你可以在下面的链接中看到: https://stackblitz.com/edit/angular5-phone-mask-directive-roeqfk?file=app/app.component.ts

提前致谢:)

【问题讨论】:

  • 你的问题到底是什么?

标签: angular typescript angular11 using-directives custom-directive


【解决方案1】:

您可以从指令内部提供默认值,并在 OnInit 生命周期挂钩中设置掩码。这还有一个好处,即每次使用此指令时默认值都是相同的。

代码:

import {Directive, ElementRef, HostListener, OnInit} from '@angular/core';
import {NgControl} from '@angular/forms';
@Directive({
  selector: '[formControlName][appPhoneMask]'
})
export class PhoneMaskDirective implements OnInit{
  defaultValue: string = '4912345678'

  constructor(public ngControl: NgControl, private elementRef: ElementRef) { }

  ngOnInit(): void {
    this.applyMask(this.defaultValue)
  }

  @HostListener('ngModelChange', ['$event'])
  onModelChange(event): void {
    this.onInputChange(event, false);
  }
  @HostListener('keydown.backspace', ['$event'])
  keydownBackspace(event): void {
    this.onInputChange(event.target.value, true);
  }
  onInputChange(event, backspace): void {
    let newVal = event.replace(/\D/g, '');
    if (backspace && newVal.length <= 6) {
      newVal = newVal.substring(0, newVal.length - 1);
    }
    
    this.applyMask(newVal)
  }

  applyMask (value): void {
    if (value.length === 0) {
      value = '';
    } else if (value.length <= 3) {
      value = value.replace(/^(\d{0,2})/, '($1)');
    } else if (value.length <= 6) {
      value = value.replace(/^(\d{0,2})(\d{0,3})/, '($1) ($2)');
    } else if (value.length <= 12) {
      value = value.replace(/^(\d{0,2})(\d{0,3})(\d{0,7})/, '($1) ($2)-$3');
    } else if (value.length <= 13) {
      value = value.replace(/^(\d{0,2})(\d{0,4})(\d{0,7})/, '($1) ($2)-$3');
    } else if (value.length <= 14) {
      value = value.replace(/^(\d{0,2})(\d{0,5})(\d{0,7})/, '($1) ($2)-$3');
    } else {
      value = value.substring(0, 14);
      value = value.replace(/^(\d{0,2})(\d{0,5})(\d{0,7})/, '($1) ($2)-$3');
    }
    this.ngControl.valueAccessor.writeValue(value);
  }

  /** This method allows to keep the formControl value without the mask, in order to use it in backend queries */
  @HostListener('input') onChange(): void {
    const newVal = this.elementRef.nativeElement.value.replace(/\D/g, '');
    this.ngControl.control.setValue(newVal, {
      emitEvent: false,
      emitModelToViewChange: false,
      emitViewToModelChange: false
    });
  }
}

【讨论】:

  • 在我的项目中,当我订阅后端时,我会收到一个电话列表,所以我需要从该响应中取出第一部电话,但我认为一旦我将它设置为输入但不是。我认为是的,指令 ngOnInit 是这样做的正确位置,但我怎样才能将电话从组件发送到指令。
  • 您可以像在任何其他子组件中一样使用@Input 装饰器来做到这一点。见docs
  • 谢谢!我做到了,仍然不起作用,但这是因为指令以某种方式接收到空值,所以我必须检查,因为在 html 中显示了值,然后我不知道在哪里丢失了。
猜你喜欢
  • 2021-03-22
  • 2018-11-16
  • 1970-01-01
  • 2014-07-12
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多