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

dan*_*iel 230 angular

只有在输入焦点发生变化后才会调用change事件.我怎样才能使事件在每个按键上触发?

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

第二个绑定在每个按键btw上发生变化.

小智 385

我刚刚使用了事件输入,它的工作原理如下:

在.html文件中:

<input type="text" class="form-control" (input)="onSearchChange($event.target.value)">
Run Code Online (Sandbox Code Playgroud)

在.ts文件中:

onSearchChange(searchValue: string): void {  
  console.log(searchValue);
}
Run Code Online (Sandbox Code Playgroud)

  • 它也适用于Angular 4.谢谢. (10认同)
  • 我们怎样才能拖延一段时间呢? (2认同)

Mar*_*cok 180

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

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

它也适用于退格键.

  • 但是当在框语法中使用香蕉时,它只会更改模型,但您无法在更改事件上挂钩. (5认同)
  • 对于最佳的双向数据绑定,这是一个很好的答案.应该是接受的答案! (4认同)
  • 退格键不更新模型 (4认同)
  • 该解决方案是正确的。但是,请注意,在值更新之前会触发ngModelChange。因此,此示例中的“ newValue”包含不带您刚刚按下的键的模型-因此您那里没有更新的模型。如果要获得最新的模型值,请使用(keyup)事件。 (4认同)

Sag*_*gar 69

(keyup)事件是你最好的选择.

让我们看看为什么:

  1. (改变)就像你提到的触发器只有当输入失去焦点时,因此用途有限.
  2. (按键)按键时触发,但不会触发某些击键,如退格键.
  3. 每次按下一个键时(keydown)都会触发.因此总是滞后1个字符; 因为它在按键被注册之前获得了元素状态.
  4. (keyup)每次键推送事件完成时都会触发,因此这也包括最新的字符.

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

  • 与(改变)事件不同,每次击键都会注册一个事件
  • 与(keydown)事件不同,没有延迟
  • 包括(按键)忽略的键

  • 如答案之一所述,输入事件的确运行良好。“ keyup”肯定是最安全的选择之一,但是,“ input”事件比“ keyup”领先一步。与输入不同的是,如果通过其他任何方式(例如绑定)更改了文本框的值,则“ keyup”将不起作用。 (2认同)
  • 这应该是公认的和最安全的答案,因为它是原生的,可以让您完全控制并且非常具有表现力,因为每个阅读它的人都知道事件何时被触发。 (2认同)
  • @ThariqNugrohotomo 不,不会。如果您正在寻找类似的东西,请使用 (input) 。 (2认同)

Gün*_*uer 36

<input type="text" [ngModel]="mymodel" (keypress)="mymodel=$event.target.value"/>
{{mymodel}}
Run Code Online (Sandbox Code Playgroud)

  • 您可能想要使用`keydown`或`keyup`.有些键只是不会触发`keypress`.另见http://stackoverflow.com/questions/4843472/javascript-listener-keypress-doesnt-detect-backspace (21认同)
  • 工作,但奇怪的是退格键不被识别为按键? (9认同)

Sal*_*ani 20

处理此类情况的另一种方法是使用formControlvalueChanges在初始化组件时订阅它,这将允许您使用rxjs运算符来执行高级要求,例如执行http请求,应用debounce直到用户完成写句子,取最后一个值并省略以前,...

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);
      });
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Eme*_*nom 18

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

<input type="text" [(ngModel)]="mymodel" (input)="valuechange($event)" />
{{mymodel}}
Run Code Online (Sandbox Code Playgroud)


小智 6

<input type="text" (keypress)="myMethod(myInput.value)" #myInput />
Run Code Online (Sandbox Code Playgroud)

存档.ts

myMethod(value:string){
...
...
}
Run Code Online (Sandbox Code Playgroud)


sta*_*ool 5

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

获取 FormGroup 的所有更改:

this.orderForm.valueChanges.subscribe(value => {
    console.dir(value);
});
Run Code Online (Sandbox Code Playgroud)

获取特定字段的更改:

this.orderForm.get('orderPriority').valueChanges.subscribe(value => {
    console.log(value);
  });
Run Code Online (Sandbox Code Playgroud)


小智 5

我设法使用以下代码在 Angular 11 中解决了这个问题:

<input type="number" min="0" max="50" [value]="input.to" name="to"
        (input)="input.to=$event.target.value; experienceToAndFrom()">
Run Code Online (Sandbox Code Playgroud)

而且,这experienceToAndFrom()是我的组件中的一个方法。

PS:我尝试了以上所有解决方案,但没有成功。