Winkel 2-Änderungsereignis bei jedem Tastendruck

282

Das Änderungsereignis wird erst aufgerufen, nachdem sich der Fokus der Eingabe geändert hat. Wie kann ich dafür sorgen, dass das Ereignis bei jedem Tastendruck ausgelöst wird?

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

Die zweite Bindung ändert sich übrigens bei jedem Tastendruck.

Daniel
quelle

Antworten:

472

Ich habe gerade die Ereigniseingabe verwendet und es hat wie folgt funktioniert:

in der HTML-Datei:

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

in .ts Datei:

onSearchChange(searchValue: string): void {  
  console.log(searchValue);
}
Ramy Feteha
quelle
Gut. Funktioniert bei mir.
Godekere
das ist genau das, wonach ich gesucht habe
Francesco Borzi
Wie verzögern wir uns für einige Zeit?
Mahmoud Hboubati
Funktioniert super! Vielen Dank
Vedha Peri
Funktioniert super, vielen Dank
Rahul Lad
193

Verwenden Sie diese Option, ngModelChangeindem Sie die [(x)]Syntax in zwei Teile aufteilen, z. B. Eigenschaftsdatenbindung und Ereignisbindung:

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

Es funktioniert auch für die Rücktaste.

Mark Rajcok
quelle
5
Wenn Sie die Banane jedoch in einer Box-Syntax verwenden, ändert sich nur das Modell, aber Sie können nichts an das Änderungsereignis binden.
Giora Guttsait
4
Das ist eine großartige Antwort für die beste bidirektionale Datenbindung. Sollte die akzeptierte Antwort sein!
Tk1993
4
Rücktaste Schlüssel aktualisiert das Modell nicht
Karan Garg
4
Diese Lösung ist richtig. Beachten Sie jedoch, dass ngModelChange VOR den Wertaktualisierungen ausgelöst wird. Der 'newValue' in diesem Beispiel enthält also das Modell OHNE die gerade gedrückte Taste - Sie haben also nicht das aktualisierte Modell dort. Wenn Sie den neuesten Modellwert haben möchten, verwenden Sie das Ereignis (keyup).
Dave0688
1
@SateeshKumarAlli Welche Version von Angular hast du? Für mich erkennt es Rückraum in Angular 6.1.3
Jette
96

Das (Keyup-) Event ist die beste Wahl.

Mal sehen warum:

  1. (Ändern), wie Sie erwähnt haben, wird nur ausgelöst, wenn die Eingabe den Fokus verliert und daher nur begrenzt von Nutzen ist.
  2. (Tastendruck) wird bei Tastendrücken ausgelöst, jedoch nicht bei bestimmten Tastenanschlägen wie der Rücktaste.
  3. (Tastendruck) wird jedes Mal ausgelöst, wenn eine Taste gedrückt wird. Daher bleibt immer um 1 Zeichen zurück; wie es den Elementstatus erhält, bevor der Tastenanschlag registriert wurde.
  4. (keyup) ist die beste Wahl, da es jedes Mal ausgelöst wird, wenn ein Tastendruckereignis abgeschlossen ist. Daher enthält dies auch den neuesten Charakter.

Also (keyup) ist am sichersten, weil es ...

  • registriert ein Ereignis bei jedem Tastendruck im Gegensatz zu einem (Änderungs-) Ereignis
  • enthält die Tasten, die (Tastendruck) ignoriert
  • hat keine Verzögerung im Gegensatz zum (Keydown) Ereignis
Sagar
quelle
4
Wie in einer der Antworten erwähnt, funktioniert das Eingabeereignis sehr gut. keyupist sicher eine der sichersten Optionen, aber die inputVeranstaltung ist einen Schritt voraus keyup. keyupIm Gegensatz dazu inputfunktioniert es nicht, wenn der Wert des Textfelds auf andere Weise geändert wird, z. B. durch Binden.
Planet_Hunter
1
Sagar, vielen Dank. Dies sollte die akzeptierte Antwort sein, da sie (change)neben einer Problemumgehung und einigen anderen die einzige ist, die tatsächlich angesprochen wird. Die akzeptierte Antwort ist total beschissen!
Cody
Gibt es einen bestimmten Grund, warum Sie dies noch einmal tun möchten (ngModelChange)?
SnailCoil
1
Dies sollte die akzeptierte und sicherste Antwort sein, da sie nativ ist und Ihnen die volle Kontrolle gibt. Sie ist sehr ausdrucksstark, da jeder, der sie liest, genau weiß, wann das Ereignis ausgelöst wird.
Florian Leitgeb
1
@ ThariqNugrohotomo Nein, würde es nicht. Verwenden Sie (Eingabe), wenn Sie nach so etwas suchen.
Sagar
39
<input type="text" [ngModel]="mymodel" (keypress)="mymodel=$event.target.value"/>
{{mymodel}}
Günter Zöchbauer
quelle
10
funktioniert, aber seltsamerweise wird die Rücktaste nicht als Tastendruck erkannt?
Daniel
22
Vielleicht möchten Sie keydownoder keyupstattdessen verwenden. Einige Schlüssel feuern einfach nicht an keypress. Siehe auch stackoverflow.com/questions/4843472/…
Günter Zöchbauer
Ich habe versucht, Ereignisse herunterzufahren, einzugeben und zu ändern, aber wenn die Eingabe w ist, meldet mir der Ereignishandler eine leere Zeichenfolge. Wenn die Eingabe wir sind, meldet sich der Ereignishandler als Eingabe an mich. Können Sie bitte erklären, warum dieses Verhalten?
Voraussicht
Drücken Sie die Taste. Die Eingabe hat sich beim Keydown noch nicht geändert.
Günter Zöchbauer
1
Es ist seltsam, aber ich bekomme eine Eingangsverzögerung, bei der der Wert den eingegebenen Wert erst beim nächsten Tastendruck enthält.
Matt Eland
25

Eine andere Möglichkeit, solche Fälle zu behandeln, besteht darin, formControl zu verwenden und es zu abonnieren, valueChangeswenn Ihre Komponente initialisiert wird. Auf diese Weise können Sie rxjs- Operatoren für erweiterte Anforderungen wie das Ausführen von http-Anforderungen verwenden, eine Entprellung anwenden, bis der Benutzer mit dem Schreiben eines Satzes fertig ist, und den letzten Wert annehmen und vorher weglassen, ...

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);
      });
  }
}
Salem Ouerdani
quelle
2
Dies ist perfekt. Dies hält das gesprächige Rauschen niedrig, wenn dies für asynchrone http-Anforderungen verwendet wird. Richtet auch bereits die Listener für Änderungsereignisse ein. Brillant! Vielen Dank!
Hewstone
Ich bin froh, dass es geholfen hat. Danke @hewstone
Salem Ouerdani
1
Bei mehreren Steuerelementen kann derselbe Code angewendet werden mitFormGroup
Vikash Kumar
20

Das geheime Ereignis, das ngModel im Winkel synchron hält, ist die Eingabe des Ereignisaufrufs . Daher sollte die beste Antwort auf Ihre Frage sein:

<input type="text" [(ngModel)]="mymodel" (input)="valuechange($event)" />
{{mymodel}}
Emeka Obianom
quelle
Es tut für mich @AndreiDiaconescu
KhoPhi
Das (Eingabe-) Ereignis wird in Edge- und IE-Browsern nicht unterstützt. Was ist die Alternative dazu im Edge-Browser?
Sudhakar
6
<input type="text" (keypress)="myMethod(myInput.value)" #myInput />

Archiv .ts

myMethod(value:string){
...
...
}
Ulric Merguiço
quelle
Willkommen bei SO Ulric, bitte erklären Sie, wie Ihr Code das Problem löst.
CPHPython
4

Was Sie suchen, ist

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

Machen Sie dann mit den Daten, was Sie wollen, indem Sie auf die Bindung this.mymodelin Ihrer .ts-Datei zugreifen .

Sanket Berde
quelle
2

In meinem Fall lautet die Lösung:

[ngModel]="X?.Y" (ngModelChange)="X.Y=$event"
hatem htira
quelle
1

Bei reaktiven Formularen können Sie die Änderungen abonnieren, die an allen Feldern oder nur an einem bestimmten Feld vorgenommen wurden.

Holen Sie sich alle Änderungen einer FormGroup:

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

Holen Sie sich die Änderung eines bestimmten Feldes:

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

Ich habe Keyup für ein Zahlenfeld verwendet, aber heute habe ich festgestellt, dass der Eingang in Chrome Auf- / Ab-Tasten hat, um den Wert zu erhöhen / zu verringern, der von Keyup nicht erkannt wird.

Meine Lösung besteht darin, Keyup zu verwenden und gemeinsam zu ändern:

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

Erste Tests zeigen, dass dies einwandfrei funktioniert. Wenn nach weiteren Tests Fehler gefunden werden, werden diese zurückgesendet.

user9273992
quelle