Her tuşa basıldığında açısal 2 değiştirme olayı


282

Change olayı yalnızca girişin odağı değiştikten sonra çağrılır. Etkinliğin her tuşa basması için nasıl yapabilirim?

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

İkinci ciltleme her tuş basışında değişir.

Yanıtlar:


473

Sadece olay girişini kullandım ve aşağıdaki gibi iyi çalıştı:

.html dosyasında:

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

.ts dosyasında:

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

İyi bir. Benim için çalışıyor.
Godekere

tam da aradığım şey buydu
Francesco Borzi

bir süre nasıl geciktiririz?
Mahmoud Hboubati

Harika çalışıyor! Thank you
Vedha Peri

Harika çalışıyor, çok teşekkürler
Rahul Lad

193

Kullanım ngModelChangeyukarı kırarak [(x)]iki adet, yani mülkiyet veri bağlama ve olay bağlayıcı içine sözdizimi:

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

Geri tuşu için de çalışır.


5
Ancak muzu bir kutu sözdiziminde kullanırken, sadece modeli değiştirir, ancak change olayına bir şey bağlayamazsınız.
Giora Guttsait

4
Bu, en iyi iki yönlü veri bağlama için harika bir cevaptır. Kabul edilen cevap olmalı!
Tk1993

4
geri silme tuşu modeli güncellemiyor
Karan Garg

4
Bu çözüm doğrudur. Ancak, değer güncellemelerinden ÖNCE ngModelChange öğesinin tetiklendiğini unutmayın. Bu nedenle, bu örnekteki 'newValue', yeni bastığınız tuş OLMADAN modeli içeriyor - böylece güncellenmiş modeliniz yok. En son model değerine sahip olmak istiyorsanız, (keyup) olayını kullanın.
dave0688

1
@SateeshKumarAlli Hangi Angular sürümüne sahipsiniz? Benim için Açısal 6.1.3
Jette

96

(Keyup) etkinliği en iyi bahistir.

Bakalım neden:

  1. Bahsettiğiniz gibi (değişiklik) yalnızca giriş odağı kaybettiğinde tetiklenir, bu nedenle sınırlı kullanım vardır.
  2. (tuşa basma ) tuşlara basmayı tetikler, ancak geri al gibi belirli tuş vuruşlarını tetiklemez.
  3. ( tuş ) her tuşa basıldığında tetiklenir. Dolayısıyla daima 1 karakter gecikmektedir; tuş vuruşu kaydedilmeden önce öğe durumunu alır.
  4. (keyup) , bir tuş etkinliğinin her tamamlanışında tetiklendiği için en iyi bahistir, bu nedenle en son karakteri de içerir.

Yani (keyup) gitmek için en güvenli olanı çünkü ...

  • (değiştir) olayın aksine her tuş vuruşuna bir olay kaydeder
  • (tuşa basma) yok sayan tuşları içerir
  • (keydown) olayından farklı olarak gecikme yok

4
Yanıtlardan birinde belirtildiği gibi, giriş etkinliği gerçekten iyi çalışıyor. keyupancak en güvenli seçeneklerden biri olduğundan, inputetkinlik bir adım öndedir keyup. keyupaksine input, metin kutusunun değeri başka bir şekilde değiştirilirse çalışmaz, örneğin bağlama.
planet_hunter

1
Sagar, çok teşekkür ederim. Bu,(change) bir geçici çözümün yanı sıra bazılarının yanı sıra ele alınacak tek yanıt olduğu için Kabul Edilen Yanıt olmalıdır . Kabul edilen cevap tamamen berbat!
Cody

bunu yapmak istemenin özel bir nedeni var (ngModelChange)mı?
SnailCoil

1
Bu, yerli olduğu ve size tam kontrol sağladığı ve çok etkileyici olduğu için kabul edilen ve en güvenli cevap olmalıdır, çünkü okuyan herkes olayın ne zaman tetiklendiğini tam olarak bilir.
Florian Leitgeb

1
@ThariqNugrohotomo Hayır, olmazdı. Böyle bir şey arıyorsanız (giriş) tuşunu kullanın.
Sagar

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

10
çalışıyor, ancak tuhaf bir şekilde geri tuşu bir tuşa basılmaz mı?
daniel

22
Bunun yerine keydownveya kullanmak isteyebilirsiniz keyup. Bazı tuşlar ateş etmiyor keypress. Ayrıca bkz stackoverflow.com/questions/4843472/…
Günter Zöchbauer

Keydown, keyup ve değişiklik olayları denedim ama girdi w olduğunda olay işleyicisi bana boş dize raporlar; girdi olduğunda biz olay işleyici bana girdi olarak w rapor. Bu davranışın nedenini açıklar mısınız?
forethought

Tuşa basmayı kullanın. Giriş, tuşlara basıldığında henüz değişmedi.
Günter Zöchbauer

1
Bu garip, ama bir sonraki tuşa kadar değerin girilen değeri içermediği bir giriş gecikmesi alıyorum.
Matt Eland

25

Bu tür durumları ele almanın farklı bir yolu, formControl'ü kullanmak ve valueChangesbileşeniniz başlatıldığında ona abone olmaktır ; bu, http isteklerini yerine getirmek, kullanıcı bir cümle yazmayı bitirene kadar son kez almak, son değeri almak için röportaj uygulamanızı sağlar. ve daha önce atlayın, ...

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
Bu harika. Bu, zaman uyumsuz http istekleri için kullanırken konuşma sesini azaltır. Ayrıca değişiklik olayı dinleyicilerini zaten ayarlar. Parlak! Teşekkürler!
hewstone

Yardımcı oldu sevindim. Teşekkürler @hewstone
Salem Ouerdani

1
Birden fazla kontrol durumunda, aynı kod uygulanabilirFormGroup
Vikash Kumar

20

Açısal ngModel'i senkronize tutan gizli olay, olay çağrısı girdisidir . Bu nedenle, sorunuzun en iyi yanıtı şöyle olmalıdır:

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

@AndreiDiaconescu
KhoPhi

(İnput) olayı Edge ve IE tarayıcılarında desteklenmez. Edge tarayıcısında bunun alternatifi nedir?
Sudhakar

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

arşiv .ts

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

SO Ulric'e hoş geldiniz, lütfen kodunuzun sorunu nasıl çözdüğünü açıklayın.
CPHPython

4

Aradığın şey

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

Ardından this.mymodel, .ts dosyanızdaki sınırlamaya erişerek verilerle istediğinizi yapın.


2

Benim durumumda, çözüm:

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

1

Reaktif Formlar için tüm alanlarda veya yalnızca belirli bir alanda yapılan değişikliklere abone olabilirsiniz.

Bir FormGroup'un tüm değişikliklerini alın:

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

Belirli bir alanın değişikliğini alın:

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

0

Bir sayı alanında keyup kullanıyorum, ancak bugün kromda girişin keyup tarafından tanınmayan değeri artırmak / azaltmak için yukarı / aşağı düğmeleri olduğunu fark ettim.

Benim çözümüm keyup kullanmak ve birlikte değiştirmek:

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

İlk testler bunun iyi çalıştığını, daha fazla testten sonra bulunan herhangi bir hata varsa geri göndereceğini gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.