Angular 2 события изменения на каждом нажатии клавиши
Событие изменения вызывается только после того, как фокус ввода изменился. Как я могу сделать это так, чтобы событие срабатывало при каждом нажатии клавиши?
<input type="text" [(ngModel)]="mymodel" (change)="valuechange($event)" />
{{mymodel}}
Второе связывание изменяется при каждом нажатии клавиши btw.
Ответы
Ответ 1
Я просто использовал ввод события, и он работал нормально следующим образом:
в .html файле:
<input type="text" class="form-control" (input)="onSearchChange($event.target.value)">
в файле .ts:
onSearchChange(searchValue: string): void {
console.log(searchValue);
}
Ответ 2
Используйте ngModelChange
, разбив синтаксис [(x)]
на две части: привязку данных и привязку событий:
<input type="text" [ngModel]="mymodel" (ngModelChange)="valuechange($event)" />
{{mymodel}}
valuechange(newValue) {
mymodel = newValue;
console.log(newValue)
}
Это работает и для клавиши возврата.
Ответ 3
Событие (keyup) - ваш лучший выбор.
Давайте посмотрим, почему:
- (изменить), как вы упомянули, срабатывает только тогда, когда вход теряет фокус, поэтому имеет ограниченное использование.
- (нажатие клавиши) срабатывает при нажатии клавиш, но не срабатывает при определенных нажатиях клавиш, например, при возврате.
- (keydown) срабатывает каждый раз, когда нажимается клавиша. Следовательно, всегда отстает на 1 символ; так как он получает состояние элемента до того, как было зарегистрировано нажатие клавиши.
- (keyup) - ваша лучшая ставка, так как она срабатывает каждый раз, когда завершается событие нажатия клавиши, поэтому сюда также входит самый последний символ.
Так что (keyup) безопаснее всего, потому что это...
- регистрирует событие при каждом нажатии клавиши в отличие от (изменения) события
- включает в себя ключи, которые (нажатие клавиши) игнорирует
- не имеет задержки в отличие от события (keydown)
Ответ 4
<input type="text" [ngModel]="mymodel" (keypress)="mymodel=$event.target.value"/>
{{mymodel}}
Ответ 5
Тайное событие, которое поддерживает angular ngModel synchronous - это вызов события . Следовательно, лучший ответ на ваш вопрос должен быть:
<input type="text" [(ngModel)]="mymodel" (input)="valuechange($event)" />
{{mymodel}}
Ответ 6
Другим способом обработки таких случаев является использование formControl и подписка на него valueChanges
при инициализации вашего компонента, что позволит вам использовать операторы 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);
});
}
}
Ответ 7
<input type="text" (keypress)="myMethod(myInput.value)" #myInput />
архив .ts
myMethod(value:string){
...
...
}
Ответ 8
То, что вы ищете, это
<input type="text" [(ngModel)]="mymodel" (keyup)="valuechange()" />
{{mymodel}}
Затем сделайте все, что хотите, с данными, обратившись к связанным this.mymodel
в ваш .ts файл.
Ответ 9
В моем случае решение состоит в следующем:
[ngModel]="X?.Y" (ngModelChange)="X.Y=$event"