我遇到了一个关于 Angular2 指令的问题,它应该实现以下功能:
- 检测用户是否输入'.'字符。
- 如果下一个字符也是'.',则删除重复的'.'并将光标位置移动到'.'字符后面。
我已经做到了上述操作,但是当与 ngModel 结合使用时,每次更新模型时光标位置都会跳到末尾。
输入:
<input type="text" name="test" [(ngModel)]="testInput" testDirective/>
指令:
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.ngModelChange.emit(val);
修复了问题,光标位置正确,但是模型没有更新。
有人能推荐解决方案吗?或者我可能对这个问题采取了错误的方法?
谢谢