当输入的类型为 Number 时,ValueChanges 在 blur 上触发
ValueChanges is triggered on blur when input is of type Number
我很惊讶地发现,与其他类型的 HTML 输入不同,在 Number 类型的输入中键入会在模糊时触发 valueChanges
,以及点击微调器 (侧面的小箭头)将 valueChanges
触发两次,这是预期的行为吗?我错过了什么吗?
分量:
export class AppComponent {
textControl = new FormControl();
numberControl = new FormControl();
ngOnInit(): void {
this.textControl.valueChanges.subscribe(console.log)
this.numberControl.valueChanges.subscribe(console.log)
}
}
模板:
<input type="text" [formControl]="numberControl">
<input type="number" [formControl]="textControl">
这是 Stackblitz demo
这是 a known issue 已在 Angular 10
中修复
Forked Stackblitz with Angular 10
在此修复之前 Angular listed to two events:
host: {
'(change)': 'onChange($event.target.value)',
'(input)': 'onChange($event.target.value)',
从 Angular 10 开始,它只监听一个:
host: {
'(input)': 'onChange($event.target.value)'
这似乎是 Angular 某些版本中的一个问题。
Github.
上也有人报告了同样的问题
https://github.com/angular/angular/issues/26054
它看起来已在 Angular 10 中修复,只要 @alon 的演示正常运行即可。
我相信这对您来说不是关键问题。
但是,一种简单的解决方案是使用 distinctUntilChanged
运算符。
this.numberControl.valueChanges
.pipe(distinctUntilChanged())
.subscribe(console.log)
我很惊讶地发现,与其他类型的 HTML 输入不同,在 Number 类型的输入中键入会在模糊时触发 valueChanges
,以及点击微调器 (侧面的小箭头)将 valueChanges
触发两次,这是预期的行为吗?我错过了什么吗?
分量:
export class AppComponent {
textControl = new FormControl();
numberControl = new FormControl();
ngOnInit(): void {
this.textControl.valueChanges.subscribe(console.log)
this.numberControl.valueChanges.subscribe(console.log)
}
}
模板:
<input type="text" [formControl]="numberControl">
<input type="number" [formControl]="textControl">
这是 Stackblitz demo
这是 a known issue 已在 Angular 10
中修复Forked Stackblitz with Angular 10
在此修复之前 Angular listed to two events:
host: {
'(change)': 'onChange($event.target.value)',
'(input)': 'onChange($event.target.value)',
从 Angular 10 开始,它只监听一个:
host: {
'(input)': 'onChange($event.target.value)'
这似乎是 Angular 某些版本中的一个问题。 Github.
上也有人报告了同样的问题https://github.com/angular/angular/issues/26054
它看起来已在 Angular 10 中修复,只要 @alon 的演示正常运行即可。
我相信这对您来说不是关键问题。
但是,一种简单的解决方案是使用 distinctUntilChanged
运算符。
this.numberControl.valueChanges
.pipe(distinctUntilChanged())
.subscribe(console.log)