Кутова подія 2 зміни на кожному натисканні клавіші


282

Подія зміни викликається лише після зміни фокусу введення. Як я можу зробити так, щоб подія почалася на кожному натисканні клавіші?

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

Друга прив'язка змінюється на кожному натисканні клавіші btw.

Відповіді:


472

Я щойно використовував вхід події, і він працював чудово так:

у .html файл:

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

у .ts файл:

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

Хороший. Працює для мене.
Годекере

саме це я шукав
Франческо Борзі

як ми затримуємось на деякий час?
Махмуд Хбубаті

Чудово працює! Дякую
Vedha Peri

Працює чудово, велике спасибі
Рахул Лад

193

Використовуйте ngModelChange, розбиваючи [(x)]синтаксис на дві частини, тобто зв'язування даних про властивості та прив'язку подій:

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

Він працює і для клавіші зворотної області.


5
Але коли ви використовуєте банан у синтаксисі коробки, він лише змінює модель, але ви не можете причепити щось до події зміни.
Джора Гуттсайт

4
Це прекрасна відповідь для найкращого двостороннього зв’язування даних. Повинна бути прийнята відповідь!
Tk1993

4
клавіша "назад" не оновлює модель
Каран Гарг

4
Це рішення є правильним. Однак майте на увазі, що ngModelChange запускається перед оновленням значення. Отже, "newValue" у цьому прикладі містить модель БЕЗ натиснутої вами клавіші - тому у вас немає оновленої моделі там. Якщо ви хочете мати останнє значення моделі, використовуйте (keyup) подія.
dave0688

1
@SateeshKumarAlli, яка у вас версія Angular? Для мене він виявляє задній простір у куті 6.1.3
Jette,

96

Подія (клавіатура) - ваша найкраща ставка.

Давайте розберемося, чому:

  1. (зміна), як ви згадали, спрацьовує лише тоді, коли вхід втрачає фокус, отже, він обмежений.
  2. (натискання клавіші) спрацьовує при натисканні клавіш, але не спрацьовує на певних натисканнях клавіш, як, наприклад, на зворотному просторі.
  3. (натискання клавіш) спрацьовує кожного разу, коли клавіша натискається вниз. Отже, завжди відстає на 1 символ; оскільки він отримує стан елемента до реєстрації натискання клавіші.
  4. (клавіатура) - ваша найкраща ставка, оскільки вона спрацьовує кожного разу, коли завершується ключова подія, отже, це стосується і останнього персонажа.

Отже (клавіатура) - це найбезпечніше, тому що це ...

  • реєструє подію на кожному натисканні клавіші на відміну від (зміни) події
  • включає клавіші, які (натискання клавіш) ігнорує
  • не має відставання на відміну від (keydown) події

4
Як було сказано в одній з відповідей, подія введення працює дуже добре. keyupБезумовно, один з найбезпечніших варіантів, проте inputподія - на крок попереду keyup. keyupна відміну input, не працює, якщо значення текстового поля змінюється будь-яким іншим способом, наприклад, прив'язуванням.
planet_hunter

1
Сагар, дуже дякую Це має бути Прийнятий відповідь, оскільки це єдиний, хто насправді звертається (change)поряд із вирішенням, а потім і деяким. Прийнята відповідь повністю гасить!
Коді

Чи є якась конкретна причина, за яку ви хотіли б це зробити (ngModelChange)?
SnailCoil

1
Це має бути прийнятою і найбезпечнішою відповіддю, оскільки вона є рідною і дає вам повний контроль, і це дуже виразно, адже кожен, хто її читає, точно знає, коли подію розгортають.
Флоріан

1
@ThariqNugrohotomo Ні, це не було б. Використовуйте (введення), якщо ви шукаєте щось подібне.
Сагар

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

10
працює, але як не дивно клавішу зворотної області не розпізнають як натискання клавіш?
Даніель

22
Ви можете використовувати keydownабо keyupзамість цього. Деякі клавіші просто не включаються keypress. Дивіться також stackoverflow.com/questions/4843472 / ...
Гюнтер Zöchbauer

Я спробував натиснути клавішу, клавіатуру та змінити події, але коли введення є, обробник подій повідомляє мені порожню рядок; коли вхід - це ми, обробник подій звітує мені w як вхід. Чи можете ви пояснити, чому така поведінка?
передбачив

Використовуйте натискання клавіш. Введення ще не змінилося при натисканні клавіш.
Günter 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. Також вже налаштовує слухачів подій зміни. Блискуче! Дякую!
hewstone

Радий, що це допомогло. Спасибі @hewstone
Salem Ouerdani

1
У разі декількох елементів контролю можна застосувати той самий кодFormGroup
Вікаш Кумар,

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.



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"

Початкові тести вказують, що це працює нормально, опублікується, якщо помилки знайдені після подальшого тестування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.