如何将掩码应用于 Typescript 中的默认值
How to apply mask to a default value in Typescript
我有一个 mask-phone 指令,当用户写入一个值时,它在输入中完美地工作,但我需要设置一个默认值,我不知道如何在中应用 mask 指令组件方法。该值在没有掩码的输入中显示,只有当我修改该值时,掩码才会出现。
我遇到的问题是在德国有几种可能的 telephone 号码,所以我不能在默认值中设置特定的掩码,例如:
(49)(170)-1111111
(49)(1514)-1111111
(49)(25679)-1111111
我写了一个例子,你可以在下面看到link:
https://stackblitz.com/edit/angular5-phone-mask-directive-roeqfk?file=app/app.component.ts
提前致谢:)
您可以从指令内部提供默认值,并在 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})/, '()');
} else if (value.length <= 6) {
value = value.replace(/^(\d{0,2})(\d{0,3})/, '() ()');
} else if (value.length <= 12) {
value = value.replace(/^(\d{0,2})(\d{0,3})(\d{0,7})/, '() ()-');
} else if (value.length <= 13) {
value = value.replace(/^(\d{0,2})(\d{0,4})(\d{0,7})/, '() ()-');
} else if (value.length <= 14) {
value = value.replace(/^(\d{0,2})(\d{0,5})(\d{0,7})/, '() ()-');
} else {
value = value.substring(0, 14);
value = value.replace(/^(\d{0,2})(\d{0,5})(\d{0,7})/, '() ()-');
}
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
});
}
}
我有一个 mask-phone 指令,当用户写入一个值时,它在输入中完美地工作,但我需要设置一个默认值,我不知道如何在中应用 mask 指令组件方法。该值在没有掩码的输入中显示,只有当我修改该值时,掩码才会出现。
我遇到的问题是在德国有几种可能的 telephone 号码,所以我不能在默认值中设置特定的掩码,例如: (49)(170)-1111111 (49)(1514)-1111111 (49)(25679)-1111111
我写了一个例子,你可以在下面看到link: https://stackblitz.com/edit/angular5-phone-mask-directive-roeqfk?file=app/app.component.ts
提前致谢:)
您可以从指令内部提供默认值,并在 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})/, '()');
} else if (value.length <= 6) {
value = value.replace(/^(\d{0,2})(\d{0,3})/, '() ()');
} else if (value.length <= 12) {
value = value.replace(/^(\d{0,2})(\d{0,3})(\d{0,7})/, '() ()-');
} else if (value.length <= 13) {
value = value.replace(/^(\d{0,2})(\d{0,4})(\d{0,7})/, '() ()-');
} else if (value.length <= 14) {
value = value.replace(/^(\d{0,2})(\d{0,5})(\d{0,7})/, '() ()-');
} else {
value = value.substring(0, 14);
value = value.replace(/^(\d{0,2})(\d{0,5})(\d{0,7})/, '() ()-');
}
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
});
}
}