gpt4 book ai didi

angular - 指令中的 nativeElement.Value 更改目前未反射(reflect)在 input/ngModelChange 事件中

转载 作者:行者123 更新时间:2023-12-04 15:10:10 24 4
gpt4 key购买 nike

试图替换输入的特殊字符,我最终写了这个简单的指令:

normalized-input.directive.ts

@Directive({
selector: "[appNormalizedInput]"
})
export class NormalizedInputDirective {
constructor(private element: ElementRef) {}

@HostListener("keypress", ["$event"]) replaceAWithB(event): void {
const initalValue: string = this.element.nativeElement.value;
this.element.nativeElement.value = initalValue.replace("a", "b");
}
}

这会在按键时将 a 替换为 b。这是我的示例 ( StackBlitz ):

app.component.html

<input type="text" (input)="onInput($event)" [(ngModel)]="model" (ngModelChange)="onModelChange()" appNormalizedInput/>
<br/>
<label>{{model}}</label>

app.component.ts

export class AppComponent {
model = "";

onInput(event) {
console.log("on input: ", event.target.value);
}

onModelChange() {
console.log("On model change: ", this.model);
}
}

一旦我输入a,我希望在控制台输出中出现b,对于model(标签内容)也是如此,但我得到了a 直到按下下一个键。问题是事件 落后输入的实际 UI 值。

处理这种情况的正确HostListener 事件是什么?我应该如何更改该值,以便在 (input)(ngModelChange) 事件中获得新值?

StackBlitz

最佳答案

如果您仍想通过处理 keypress 事件来完成此操作,并且还想在键入时保留光标位置,那么您可以尝试以下选项:

@HostListener("keypress", ["$event"]) replaceAWithB(e): void {
if (e.key === 'a') {
const { selectionStart: start, selectionEnd: end, value: oldValue } = e.target;

e.target.value = oldValue.slice(0, start) + 'b' + oldValue.slice(end);
e.target.selectionStart = e.target.selectionEnd = start + 1;

e.preventDefault();
e.target.dispatchEvent(new KeyboardEvent('input'));
}
}

Forked Stackblitz

关于angular - 指令中的 nativeElement.Value 更改目前未反射(reflect)在 input/ngModelChange 事件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65351213/

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