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

    10-13 07:39