Я пытаюсь создать маску поля, например, вводит 111, а при наборе автоматически становится xxx. через кнопку «глаз» я показываю значение, такое как ххх или 111. Когда значок глаза включен, когда он вводит 1, он будет отображаться только как 1. Когда значок глаза выключен, когда он вводит 1, он будет отображаться как x. Проблема, с которой я сталкиваюсь, заключается в том, что когда он печатает, когда значок глаза выключен, все значения записываются как xx. Поэтому, когда он нажимает на значок глаза, чтобы сделать это, у меня нет первоначального значения. Есть ли способ, которым я могу просто обновить только значение представления и сохранить значение элемента управления формы как оригинал. Пожалуйста, найдите код ниже.
import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';
import { NgControl } from '@angular/forms';
@Directive({
selector: '[appSsnMask]'
})
export class SsnMaskDirective {
visible = false;
toggleElem;
toggleElemATag;
toggleElemITag;
parentElem;
inputElem;
private value: any;
private element: HTMLInputElement;
constructor(
private elem: ElementRef,
private renderer: Renderer2,
public formControl: NgControl
) {
this.element = elem.nativeElement;
}
ngOnInit() {
this.inputElem = this.elem.nativeElement;
this.parentElem = this.inputElem.parentElement;
// create toggle button
this.toggleElem = this.renderer.createElement('span');
this.toggleElemATag = this.renderer.createElement('a');
this.toggleElemITag = this.renderer.createElement('i');
this.renderer.addClass(this.toggleElemITag, 'fa');
this.renderer.addClass(this.toggleElemITag, 'fa-eye');
// append toggle element to input element holder
this.renderer.appendChild(this.toggleElem, this.toggleElemATag);
this.renderer.appendChild(this.toggleElemATag, this.toggleElemITag);
this.renderer.appendChild(this.parentElem, this.toggleElem);
// listen to event on toggle button
this.renderer.listen(this.toggleElemATag, 'mousedown', this.toggleMask.bind(this));
this.value = this.element.value;
this.maskValue(true);
}
toggleMask(e) {
e.preventDefault();
this.visible = !this.visible;
if (this.visible) {
this.showSlashIcon();
} else {
this.showEyeIcon();
}
this.maskValue(!this.visible);
}
eyeStatus(status) {
if (status) {
this.showEyeIcon();
} else {
this.showEyeIcon();
}
}
showSlashIcon() {
this.renderer.removeClass(this.toggleElemITag, 'fa-eye');
this.renderer.addClass(this.toggleElemITag, 'fa-eye-slash');
}
showEyeIcon() {
this.renderer.removeClass(this.toggleElemITag, 'fa-eye-slash');
this.renderer.addClass(this.toggleElemITag, 'fa-eye');
}
@HostListener('input')
onChange() {
this.value = this.element.value;
this.maskValue(!this.visible);
}
@HostListener('focus')
focusListener() {
this.renderer.appendChild(this.parentElem, this.toggleElem);
}
@HostListener('blur')
blurListener() {
if (this.formControl.control.invalid && this.formControl.control.errors
&& this.formControl.control.dirty && this.formControl.control.touched) {
this.renderer.removeChild(this.parentElem, this.toggleElem);
} else {
this.renderer.appendChild(this.parentElem, this.toggleElem);
}
}
maskValue(status) {
if (status) {
this.element.value = this.element.value.replace(/[0-9]/g, 'x');
} else {
this.element.value = this.value;
}
}
}