每个按键上的Angular 2更改事件


282

仅在输入的焦点已更改后才调用change事件。如何使事件在每次按键上触发?

<input type="text" [(ngModel)]="mymodel" (change)="valuechange($event)" />
{{mymodel}}

第二个绑定会在每次按键时改变。

Answers:


471

我只使用了事件输入,它按如下所示工作正常:

在.html文件中:

<input type="text" class="form-control" (input)="onSearchChange($event.target.value)">

在.ts文件中:

onSearchChange(searchValue: string): void {  
  console.log(searchValue);
}

好一个 为我工作。
Godekere

这正是我在寻找的东西
Francesco Borzi

我们如何延迟一段时间?
Mahmoud Hboubati

很棒!谢谢
Vedha Peri 18/12/19

效果很好,非常感谢
Rahul Lad

193

使用ngModelChange通过打破了[(x)]语法到它的两片,即财产数据绑定和事件绑定:

<input type="text" [ngModel]="mymodel" (ngModelChange)="valuechange($event)" />
{{mymodel}}
valuechange(newValue) {
  mymodel = newValue;
  console.log(newValue)
}

它也适用于退格键。


5
但是,在框式语法中使用香蕉时,它仅会更改模型,但无法在change事件上进行钩挂。
Giora Guttsait

4
这是最好的双向数据绑定的好答案。应该是公认的答案!
Tk1993

4
退格键未更新模型
Karan Garg'5

4
该解决方案是正确的。但是,请注意,在值更新之前会触发ngModelChange。因此,在此示例中,“ newValue”包含不带您刚刚按下的键的模型-因此您那里没有更新的模型。如果要获得最新的模型值,请使用(keyup)事件。
dave0688 '17

1
@SateeshKumarAlli您拥有哪个版本的Angular?对我来说,它确实在Angular 6.1.3中检测到退格
Jette 18'Aug

96

(keyup)事件是最好的选择。

让我们看看为什么:

  1. (更改)就像您提到的那样,仅在输入失去焦点时才触发,因此用途有限。
  2. (按键)会在触发,但不会在某些击键(如退格上触发。
  3. (按键)每次按下键时触发。因此总是滞后1个字符;因为它在注册击键之前获得了元素状态。
  4. (keyup)是您最好的选择,因为它在每次按键事件完成时都会触发,因此也包括最近的角色。

所以(keyup)是最安全的选择,因为它...

  • 与(change)事件不同,在每个按键上注册一个事件
  • 包括(keypress)忽略的键
  • 与(keydown)事件不同,没有滞后

4
如答案之一所述,输入事件的确运行良好。keyup是肯定是最安全的选择之一,但是input活动比提前了一步keyupkeyup不像input,如果通过其他方式(例如,绑定)更改了文本框的值,则该方法不起作用。
planet_hunter '18

1
萨加尔,非常感谢。这应该是“已接受的答案”,因为它是唯一实际解决(change)的方法,然后是一些解决方法。接受的答案很烂!
科迪

您是否有任何特殊原因要这样做(ngModelChange)
SnailCoil

1
这应该是公认的,最安全的答案,因为它是本机的,可以完全控制您,并且非常有表达力,因为读取该内容的每个人都确切知道何时触发该事件。
Florian Leitgeb

1
@ThariqNugrohotomo不,不会。如果您正在寻找类似的东西,请使用(输入)。
萨加尔

39
<input type="text" [ngModel]="mymodel" (keypress)="mymodel=$event.target.value"/>
{{mymodel}}

10
可以,但是奇怪的是,退格键无法识别为按键?
丹尼尔(Daniel)2016年

22
您可能要使用keydownkeyup代替。有些键不能开火keypress。另请参见stackoverflow.com/questions/4843472/...
君特Zöchbauer

我已经尝试了keydown,keyup和change事件,但是当输入为w时,事件处理程序会向我报告空字符串;当输入是我们时,事件处理程序向我报告w作为输入。您能解释一下这种现象的原因吗?
深思熟虑

使用按键。按下按键时输入尚未更改。
君特Zöchbauer

1
这很奇怪,但是我对此有所输入滞后,在下一次按键之前,该值不包含键入的值。
马特·伊兰德

25

处理这种情况的另一种方法是在组件初始化时使用formControl并进行订阅valueChanges,这将允许您使用rxjs运算符来满足高级要求,例如执行http请求,应用反跳操作直到用户写完句子,获取最后一个值并省略先前的...

import {Component, OnInit} from '@angular/core';
import { FormControl } from '@angular/forms';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';

@Component({
  selector: 'some-selector',
  template: `
    <input type="text" [formControl]="searchControl" placeholder="search">
  `
})
export class SomeComponent implements OnInit {
  private searchControl: FormControl;
  private debounce: number = 400;

  ngOnInit() {
    this.searchControl = new FormControl('');
    this.searchControl.valueChanges
      .pipe(debounceTime(this.debounce), distinctUntilChanged())
      .subscribe(query => {
        console.log(query);
      });
  }
}

2
太棒了。当将其用于异步http请求时,这可以降低聊天噪音。还已经设置了更改事件侦听器。辉煌!谢谢!
hewstone18年

很高兴它有所帮助。感谢@hewstone
Salem Ouerdani '18

1
如果有多个控件,则可以将相同的代码应用于FormGroup
Vikash Kumar,

20

使角ngModel保持同步的秘密事件是事件调用输入。因此,对您问题的最佳答案应该是:

<input type="text" [(ngModel)]="mymodel" (input)="valuechange($event)" />
{{mymodel}}

它对我有用@AndreiDiaconescu
KhoPhi

Edge和IE浏览器不支持(输入)事件。在Edge浏览器中有什么替代方法?
Sudhakar


4

您正在寻找的是

<input type="text" [(ngModel)]="mymodel" (keyup)="valuechange()" />
{{mymodel}}

然后,通过访问this.mymodel.ts文件中的绑定,对数据进行任何所需的操作。



1

对于反应式表单,您可以订阅对所有字段或仅特定字段所做的更改。

获取FormGroup的所有更改:

this.orderForm.valueChanges.subscribe(value => {
    console.dir(value);
});

获取特定字段的更改:

this.orderForm.get('orderPriority').valueChanges.subscribe(value => {
    console.log(value);
  });

0

我一直在数字字段上使用keyup,但是今天我注意到在chrome中,输入具有向上/向下按钮以增加/减小keyup不能识别的值。

我的解决方案是使用keyup并一起更改:

(keyup)="unitsChanged[i] = true" (change)="unitsChanged[i] = true"

初步测试表明它可以正常工作,如果在进一步测试后发现任何错误,则会回发。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.