キーを押すたびにAngular 2 changeイベント


282

changeイベントは、入力のフォーカスが変更された後にのみ呼び出されます。キーを押すたびにイベントが発生するようにするにはどうすればよいですか?

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

2番目のバインディングは、キーを押すたびに変わります。

回答:


472

私はイベント入力を使用しただけで、次のように正常に機能しました。

.htmlファイル内:

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

.tsファイル内:

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

いいね。私のために働く。
Godekere、2017年

これがまさに私が探していたものです
Francesco Borzi

しばらく遅延させるにはどうすればよいですか?
Mahmoud Hboubati

よく働く!ありがとう
Vedha Peri

すばらしい作品、ありがとうございました
Rahul Lad

193

構文を2つの部分(プロパティデータバインディングとイベントバインディング)にngModelChange分割して使用し[(x)]ます。

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

バックスペースキーにも使用できます。


5
ただし、ボックス構文でバナナを使用すると、モデルのみが変更されますが、変更イベントで何かをフックすることはできません。
Giora Guttsait 2017年

4
これは、最高の双方向データバインディングに最適な答えです。受け入れられる答えでなければなりません!
Tk1993

4
バックスペースキーでモデルが更新されない
Karan Garg

4
そのソリューションは正しいです。ただし、値が更新される前にngModelChangeが発生することに注意してください。したがって、この例の「newValue」には、押したばかりのキーなしのモデルが含まれているため、更新されたモデルはありません。最新のモデル値が必要な場合は、(keyup)イベントを使用します。
dave0688 2017年

1
@SateeshKumarAlliどのバージョンのAngularをお持ちですか?私にとっては、Angular 6.1.3のバックスペースを検出します
Jette、2018

96

(キーアップ)イベントが最善の策です。

その理由を見てみましょう:

  1. (変更)あなたが述べたように、入力がフォーカスを失ったときにのみトリガーをトリガーするため、用途は限られています。
  2. (キープレス)キーを押すとトリガーされますが、バックスペースのような特定のキーストロークではトリガーされません。
  3. (keydown)キーが押されるたびにトリガーされます。したがって、常に1文字遅れます。キーストロークが登録される前の要素の状態を取得するため。
  4. (キーアップ)は、キープッシュイベントが完了するたびにトリガーされるので、最新のキャラクターも含まれます。

それで、(キーアップ)は一緒に行くのが最も安全です...

  • (変更)イベントとは異なり、キーストロークごとにイベントを登録します
  • (keypress)が無視するキーを含む
  • (keydown)イベントとは異なり、遅延はありません

4
回答の1つで述べたように、入力イベントは非常にうまく機能します。keyupは確かに最も安全なオプションの1つですが、inputイベントはの1ステップ先ですkeyupkeyupとは異なりinput、テキストボックスの値がバインディングなどの他の方法で変更された場合は機能しません。
planet_hunter

1
佐賀さん、どうもありがとうございました。これは、実際に(change)回避策と一緒に対処し、その後に対処する唯一の方法であるため、承認された回答である必要があります。受け入れられた答えは完全に最悪です!
Cody

これをやりたいと思う特別な理由はあります(ngModelChange)か?
SnailCoil 2018年

1
これはネイティブであり、完全に制御でき、非常に表現力があるため、受け入れられて最も安全な答えになるはずです。これを読む人は誰でも、イベントがいつ発生したかを正確に知っているからです。
Florian Leitgeb

1
@ThariqNugrohotomoいいえ、そうではありません。そのようなものを探している場合は、(入力)を使用します。
Sagar

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

10
動作しますが、奇妙なことに、バックスペースキーがキー押下として認識されませんか?
ダニエル2016

22
keydownまたはkeyup代わりに使用したい場合があります。一部のキーはで起動しませんkeypress。参照してくださいstackoverflow.com/questions/4843472/...
ギュンターZöchbauer

キーダウン、キーアップ、変更イベントを試しましたが、入力がwの場合、イベントハンドラーは空の文字列を報告します。入力が私たちの場合、イベントハンドラーは入力としてwにレポートします。この動作を説明してください。
先見の明

キープレスを使用します。キーダウン時の入力はまだ変更されていません。
ギュンターZöchbauer

1
奇妙なことですが、次のキーを押すまで、入力された値が値に含まれていないという点で、入力ラグが発生しています。
Matt Eland 2017

25

そのようなケースを処理する別の方法は、formControlを使用valueChangesしてコンポーネントを初期化するときにサブスクライブすることです。これにより、httpリクエストの実行などの高度な要件にrxjsオペレーターを使用でき、ユーザーが文を書き終えるまでデバウンスを適用し、最後の値を取得しますそして、前を省略します...

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リクエストでこれを使用するときのおしゃべりなノイズが抑えられます。また、すでに変更イベントリスナーが設定されています。鮮やかさ!ありがとう!
hewstone

それが助けてうれしい。ありがとう@hewstone
Salem Ouerdani 2018

1
複数のコントロールの場合は、同じコードを適用できますFormGroup
Vikash Kumar

20

角度ngModelの同期を保つ秘密のイベントは、イベント呼び出し入力です。したがって、あなたの質問に対する最良の答えは次のとおりです。

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

@AndreiDiaconescu
KhoPhi

(入力)イベントはEdgeおよびIEブラウザーではサポートされていません。Edgeブラウザーでこれを実行する代替手段は何ですか?
Sudhakar、

6
<input type="text" (keypress)="myMethod(myInput.value)" #myInput />

アーカイブ.ts

myMethod(value:string){
...
...
}

SO Ulricへようこそ。コードで問題を解決する方法を説明してください。
CPHPython

4

あなたが探しているのは

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

次にthis.mymodel、.tsファイルのバウンドにアクセスして、データで必要なことをすべて実行します。


2

私の場合、解決策は次のとおりです。

[ngModel]="X?.Y" (ngModelChange)="X.Y=$event"

1

リアクティブフォームの場合、すべてのフィールドまたは特定のフィールドに加えられた変更をサブスクライブできます。

FormGroupのすべての変更を取得します。

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

特定のフィールドの変更を取得します。

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

0

私は数値フィールドでキーアップを使用していましたが、今日、クロムで入力にキーアップで認識されない値を増減するための上下ボタンがあることに気付きました。

私の解決策は、キーアップを使用して一緒に変更することです:

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

最初のテストでは、これが正常に機能することを示し、さらなるテストの後にバグが見つかった場合はポストバックします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.