키를 누를 때마다 각도 2 변경 이벤트


282

change 이벤트는 입력의 포커스가 변경된 후에 만 ​​호출됩니다. 키를 누를 때마다 이벤트가 발생하도록하려면 어떻게해야합니까?

<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);
}

좋아요 나를 위해 작동합니다.
Godekere

이것이 바로 내가 찾던 것입니다
Francesco Borzi

우리는 어떻게 한동안 지연합니까?
Mahmoud Hboubati 17시 42 분

잘 작동합니다! 감사합니다
Vedha Peri

위대한 작품, 고마워요
Rahul Lad

193

사용 ngModelChange위쪽 파괴함으로써 [(x)]그 두 가지, 즉, 속성 데이터 바인딩 및 이벤트 바인딩에 구문 :

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

백 스페이스 키에서도 작동합니다.


5
그러나 상자 구문에서 바나나를 사용하면 모델 만 변경되지만 change 이벤트에 무언가를 연결할 수는 없습니다.
Giora Guttsait

4
최고의 양방향 데이터 바인딩에 대한 훌륭한 답변입니다. 허용되는 답변이어야합니다!
Tk1993

4
백 스페이스 키가 모델을 업데이트하지 않음
Karan Garg

4
그 해결책이 맞습니다. 그러나 값 업데이트 전에 ngModelChange가 시작된다는 점에 유의하십시오. 따라서이 예제의 'newValue'에는 방금 누른 키가없는 모델이 포함되어 있으므로 업데이트 된 모델이 없습니다. 최신 모델 값을 원하면 (키업) 이벤트를 사용하십시오.
dave0688

1
당신은 어떤 버전의 Angular를 가지고 있습니까? 나를 위해 그것은 Angular 6.1.3에서 백 스페이스를 감지합니다
Jette

96

(키업) 이벤트가 가장 좋습니다.

이유를 보자 :

  1. 입력이 초점을 잃을 때만 트리거가 언급되었으므로 (변경) 사용이 제한됩니다.
  2. (키 누르기) 는 키를 누를 때 트리거되지만 백 스페이스와 같은 특정 키를 누를 때는 트리거하지 않습니다.
  3. ( 키 다운)은 키를 누를 때마다 트리거됩니다. 따라서 항상 1 문자만큼 지연됩니다. 키 입력이 등록되기 전에 요소 상태를 가져옵니다.
  4. (키업) 은 키 푸시 이벤트가 완료 될 때마다 트리거되므로 가장 좋은 방법이므로 가장 최근의 캐릭터도 포함됩니다.

따라서 (키업)은 가장 안전합니다.

  • (변경) 이벤트와 달리 모든 키 입력에 이벤트를 등록합니다
  • (키 누름) 무시하는 키 포함
  • (keydown) 이벤트와 달리 지연이 없습니다.

4
답변 중 하나에서 언급했듯이 입력 이벤트가 실제로 잘 작동합니다. keyup그러나 가장 안전한 옵션 중 하나이지만 input이벤트는 한 걸음 앞서 keyup있습니다. keyup와 달리 input텍스트 상자의 값이 바인딩과 같은 다른 방법으로 변경되면 작동하지 않습니다.
planet_hunter

1
사가르, 정말 고마워 실제로 해결 방법과 함께 해결하는 방법 중 일부만 허용되는 답변 이므로 수락 된 답변이어야합니다(change) . 허용 된 답변은 완전히 짜증납니다!
Cody

당신이 이것을하고 싶은 특별한 이유가 (ngModelChange)있습니까?
SnailCoil 2016 년

1
이것은 기본적으로 허용되고 가장 안전한 답변이어야하며 모든 권한을 부여하고 매우 표현력이 뛰어납니다.이를 읽는 사람은 이벤트가 언제 시작되는지 정확히 알기 때문입니다.
Florian Leitgeb

1
@ThariqNugrohotomo 아니오, 그렇지 않습니다. 그런 것을 찾고 있다면 (입력)을 사용하십시오.
Sagar

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
이상하지만, 다음 키를 누를 때까지 값이 입력 된 값을 포함하지 않는 입력 지연이 발생합니다.
Matt Eland

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 요청에 이것을 사용할 때 chatty noise를 유지합니다. 또한 이미 변경 이벤트 리스너를 설정했습니다. 훌륭한! 감사!
hewstone

도움이되어 다행입니다. 감사합니다 @ 휴스톤
Salem Ouerdani

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.