gpt4 book ai didi

angular - 如何在动态更新时检测输入值的变化(Angular 6)

转载 作者:行者123 更新时间:2023-12-04 01:51:51 25 4
gpt4 key购买 nike

我正在使用自定义指令和自定义管道对文本输入进行货币格式化。它适用于任何类型的直接用户输入(焦点、模糊、按键)。但是,当值动态更改时,我似乎无法捕获更改事件。我也找不到可靠的 hoSTListener 事件列表,也不知道如何捕获输入的任何事件(因此无法看到正在发生什么事件,如果有的话)。

动态地,该值是用 patchValue 设置的,我已将 emitEvent 设置为 true 但这似乎什么都不做(无论如何我假设它默认为 true):

myInput.patchValue({content: currentContent}, { emitEvent: true });

我可以在使用 patchValue 设置内容值之前重写货币格式,但这不利于可重用性。

这是我的指令:

import { Directive, HostListener, ElementRef, OnInit } from '@angular/core';
import { CurrencyPipe } from '../pipes/currency.pipe';

@Directive({
selector: '[appCurrency]'
})
export class CurrencyDirective implements OnInit {

constructor(
private elementRef:ElementRef,
private formatcurrencypipe:CurrencyPipe
) { }

ngOnInit(){
//this.elementRef.nativeElement.value = this.formatcurrencypipe.transform(this.elementRef.nativeElement.value);
}

@HostListener("change", ["$event.target.value", "$event"]) onChange(value, event) {
//this.elementRef.nativeElement.value = this.formatcurrencypipe.parse(value);
}

@HostListener("valueChange", ["$event.target.value", "$event"]) onValueChange(value, event) {
console.log('in onValueChange');
//doesn't trigger when the value is changed dynamically
}

@HostListener("focus",["$event.target.value","$event"]) onFocus(value,event) {
console.log('in focus');
this.elementRef.nativeElement.value = this.formatcurrencypipe.parse(value);
if(event.which == 9)
{
return false;
}
this.elementRef.nativeElement.select();
}

@HostListener("blur", ["$event.target.value"]) onBlur(value) {
console.log('in blur');
this.elementRef.nativeElement.value = this.formatcurrencypipe.transform(value);
}

@HostListener('keydown', ['$event']) onKeyDown(event) {
let e = <KeyboardEvent> event;
console.log('e.keyCode: ', e.keyCode, e.ctrlKey, e.metaKey);
//delete, backspace, tab, escape, enter, decimal, period, arrow left, arrow right
if ([46, 8, 9, 27, 13, 110, 190, 37, 39].indexOf(e.keyCode) !== -1
|| (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) //CTRL + A
|| (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) //CTRL + C
|| (e.keyCode === 86 && (e.ctrlKey || e.metaKey)) //CTRL + V
|| (e.keyCode === 88 && (e.ctrlKey || e.metaKey))) { //CTRL + X
//do nothing
return;
}

// Check for number
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
}
}

我在这里添加了 stackblitz:https://stackblitz.com/edit/angular-tys9cy

最佳答案

FormGroupFormControl 这样的响应式表单实例有一个 valueChanges 方法返回一个 observable 发出最新的值。它不会发出 DOM 事件。
解决方案

而不是 valueChange 绑定(bind)到 ngModelChange,它将在两个事件上触发,即当 formControl 在 View 中或通过模型更新时。

@HostListener("ngModelChange", [ "$event"]) onNgModelChange(value) {
console.log(value)
this.elementRef.nativeElement.value = this.formatcurrencypipe.transform(value);
}

Working StackBlitz

关于angular - 如何在动态更新时检测输入值的变化(Angular 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52609806/

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