次のことを行う 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);
問題が修正され、カーソル位置は正しくなりますが、モデルは更新されません。
誰でもこれに対する解決策を推奨できますか? それとも、問題に対して間違ったアプローチを取っているのでしょうか?
ありがとう