I am having an issue with an Angular2 directive that should do the following:
- Detect if the user enters '.' character.
- If the next char is also '.', remove the duplicate '.' and move the cursor position to after the '.' char
I have the above working, however, when using this in combination with ngModel, the cursor position jumps to the end every time the model is updated.
The input:
<input type="text" name="test" [(ngModel)]="testInput" testDirective/>
The directive:
import {Directive, ElementRef, Renderer, HostListener, Output, EventEmitter} from '@angular/core';
@Directive({
selector: '[testDirective][ngModel]'
})
export class TestDirective {
@Output() ngModelChange: EventEmitter<any> = new EventEmitter();
constructor(private el: ElementRef,
private render: Renderer) { }
@HostListener('keyup', ['$event']) onInputChange(event) {
// get position
let pos = this.el.nativeElement.selectionStart;
let val = this.el.nativeElement.value;
// if key is '.' and next character is '.', skip position
if (event.key === '.' &&
val.charAt(pos) === '.') {
// remove duplicate periods
val = val.replace(duplicatePeriods, '.');
this.render.setElementProperty(this.el.nativeElement, 'value', val);
this.ngModelChange.emit(val);
this.el.nativeElement.selectionStart = pos;
this.el.nativeElement.selectionEnd = pos;
}
}
}
This works, except the cursor position jumps to the end. Removing the line:
this.ngModelChange.emit(val);
Fixes the issue and the cursor position is correct, however the model is not updated.
Can anyone recommend a solution to this? Or maybe I am taking the wrong approach to the problem?
Thanks