con*_*nor 7 directive input keyup ngmodel angular
我有一个Angular2指令的问题,应该执行以下操作:
我有上述工作,但是,当与ngModel结合使用时,每次更新模型时光标位置都会跳到最后.
输入:
<input type="text" name="test" [(ngModel)]="testInput" testDirective/>
Run Code Online (Sandbox Code Playgroud)
指令:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,除了光标位置跳到最后.删除行:
this.ngModelChange.emit(val);
Run Code Online (Sandbox Code Playgroud)
修复问题并且光标位置正确,但模型未更新.
任何人都可以推荐一个解决方案吗?或者我可能采取了错误的方法解决问题?
谢谢
Ale*_*nov 11
您需要在setTimeout()调用中包含以下行.原因是您需要为浏览器提供渲染新值的时间,然后才能更改在新值渲染后重置的光标位置.不幸的是,这会导致一点点闪烁,但我无法找到任何其他方法使其工作.
setTimeout(() => {
this.el.nativeElement.selectionStart = pos;
this.el.nativeElement.selectionEnd = pos;
});
Run Code Online (Sandbox Code Playgroud)
您可以在没有 setTimout() 的情况下更改光标的位置,并按照使用setSelectionRange() 的已接受答案中的建议进行闪烁,如下所示:
this.el.nativeElement.setSelectionRange(position, position, 'none');
示例:stackblitz
| 归档时间: |
|
| 查看次数: |
10154 次 |
| 最近记录: |