Я попытался создать пользовательскую директиву, позволяющую пользователям вводить только цифры в текстовом поле, и эти числа будут отформатированы с использованием формата локали (разделители тысяч, разделитель десятичных дробей)
Мне удалось создать директиву, в которой для этого используется пользовательский канал, однако я не могу установить значение по умолчанию в правильном формате.
Я сделал Плункер, чтобы вы точно знали, о чем я говорю:
https://next.plnkr.co/edit/ToxPEEooR5lvCJOm?preview
Я не знаю почему, но я не могу заставить демо-приложение работать на Plunker. Вероятно, небольшая проблема.
Вот моя директива
import { Directive, HostListener, ElementRef, OnInit, Input } from '@angular/core';
import { NumberMaskPipe } from './number-mask.pipe';
@Directive({
selector: 'input[type=text][numberMask]'
})
export class NumberMaskDirective implements OnInit {
private el: HTMLInputElement;
// tslint:disable-next-line:no-input-rename
@Input('ngModel') private initialValue: any;
constructor(
private elementRef: ElementRef,
private numberMaskPipe: NumberMaskPipe
) {
this.el = this.elementRef.nativeElement;
}
public ngOnInit() {
console.log('ngOnInit', this.initialValue); // LOG ngOnInit 1005698
console.log(this.numberMaskPipe.transform(this.initialValue)); // LOG 1,005,698.00
console.log('this.el', this.el); // LOG this.el <input _ng2content-c2 class="form-control...
console.log('this.el.value', this.el.value); // this.el.value is empty on init. Why ??
this.el.value = this.numberMaskPipe.transform(this.initialValue); // Does not change the input value. Why ??
}
@HostListener('focus', ['$event.target.value'])
onFocus(value) {
this.el.value = this.numberMaskPipe.parse(value); // opposite of transform
}
@HostListener('blur', ['$event.target.value'])
onBlur(value) {
this.el.value = this.numberMaskPipe.transform(value);
}
@HostListener('keydown', ['$event']) onKeyDown(event) {
const e = < KeyboardEvent > event;
if ([46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 ||
// Allow: Ctrl+A
(e.keyCode === 65 && (e.ctrlKey || e.metaKey)) ||
// Allow: Ctrl+C
(e.keyCode === 67 && (e.ctrlKey || e.metaKey)) ||
// Allow: Ctrl+V
(e.keyCode === 86 && (e.ctrlKey || e.metaKey)) ||
// Allow: Ctrl+X
(e.keyCode === 88 && (e.ctrlKey || e.metaKey)) ||
// Allow: home, end, left, right
(e.keyCode >= 35 && e.keyCode <= 39)) {
// let it happen, don't do anything
return;
}
// Ensure that it is a number and stop the keypress
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
}
}
Не могли бы вы сказать мне, как инициализировать поле ввода с его значением, отформатированным с использованием моей директивы?
Заранее спасибо