gpt4 book ai didi

Angular2 keyup事件更新ngModel光标位置跳转到结束

转载 作者:太空狗 更新时间:2023-10-29 17:17:23 24 4
gpt4 key购买 nike

我遇到了一个 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);

修复了问题,光标位置正确,但模型未更新。

有人可以推荐解决方案吗?或者也许我对问题采取了错误的方法?

谢谢

最佳答案

您需要在 setTimeout() 调用中包含以下行。原因是您需要给浏览器时间来呈现新值,然后才更改在新值呈现后重置的光标位置。不幸的是,这会引起一点点闪烁,但我找不到任何其他方法让它工作。

setTimeout(() => {
this.el.nativeElement.selectionStart = pos;
this.el.nativeElement.selectionEnd = pos;
});

关于Angular2 keyup事件更新ngModel光标位置跳转到结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40931845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com