Sự kiện thay đổi góc 2 trên mỗi phím bấm


282

Sự kiện thay đổi chỉ được gọi sau khi trọng tâm của đầu vào đã thay đổi. Làm thế nào tôi có thể làm cho nó để sự kiện kích hoạt trên mọi phím bấm?

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

Các ràng buộc thứ hai thay đổi trên mỗi btw nhấn phím.

Câu trả lời:


472

Tôi chỉ sử dụng đầu vào sự kiện và nó hoạt động tốt như sau:

trong tệp .html:

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

trong tập tin .ts:

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

Tốt một. Làm việc cho tôi.
Godekere

đây chính xác là những gì tôi đang tìm kiếm
Francesco Borzi

Làm thế nào để chúng ta trì hoãn một thời gian?
Mahmoud Hboubati

Hoạt động tuyệt vời! Cảm ơn bạn
Vedha Peri

Hoạt động tuyệt vời, Cảm ơn rất nhiều
Rahul Lad

193

Sử dụng ngModelChangebằng cách chia [(x)]cú pháp thành hai phần của nó, nghĩa là cơ sở dữ liệu thuộc tính và ràng buộc sự kiện:

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

Nó hoạt động cho phím backspace quá.


5
Nhưng khi sử dụng chuối trong cú pháp hộp, nó chỉ thay đổi mô hình, nhưng bạn không thể móc cái gì đó vào sự kiện thay đổi.
Giora Guttsait

4
Đó là một câu trả lời tuyệt vời cho ràng buộc dữ liệu hai chiều tốt nhất. Nên là câu trả lời được chấp nhận!
Tk1993

4
Phím backspace không cập nhật mô hình
Karan Garg

4
Giải pháp đó là chính xác. Tuy nhiên, lưu ý rằng ngModelChange được kích hoạt TRƯỚC KHI cập nhật giá trị. Vì vậy, 'newValue' trong ví dụ này chứa mô hình KHÔNG CÓ khóa bạn vừa nhấn - vì vậy bạn không có mô hình cập nhật ở đó. Nếu bạn muốn có giá trị mô hình gần đây nhất, hãy sử dụng sự kiện (keyup).
dave0688

1
@SateeshKumar ALLi bạn có phiên bản nào của Angular? Đối với tôi, nó phát hiện backspace trong Angular 6.1.3
Jette

96

Sự kiện (keyup) là đặt cược tốt nhất của bạn.

Hãy xem tại sao:

  1. (thay đổi) như bạn đã đề cập kích hoạt chỉ khi đầu vào mất tập trung, do đó được sử dụng hạn chế.
  2. (nhấn phím) kích hoạt khi nhấn phím nhưng không kích hoạt trên một số tổ hợp phím nhất định như phím lùi.
  3. (keydown) kích hoạt mỗi khi phím được nhấn xuống. Do đó luôn trễ 1 ký tự; vì nó có trạng thái phần tử trước khi tổ hợp phím được đăng ký.
  4. (keyup) là đặt cược tốt nhất của bạn vì nó kích hoạt mỗi khi sự kiện đẩy phím hoàn thành, do đó điều này cũng bao gồm các ký tự gần đây nhất.

Vì vậy (keyup) là cách an toàn nhất để đi cùng vì nó ...

  • đăng ký một sự kiện trên mỗi tổ hợp phím không giống như sự kiện (thay đổi)
  • bao gồm các phím (nhấn phím) bỏ qua
  • không có độ trễ không giống như sự kiện (keydown)

4
Như đã đề cập trong một trong những câu trả lời, sự kiện đầu vào hoạt động thực sự tốt. keyupchắc chắn là một trong những lựa chọn an toàn nhất, tuy nhiên, inputsự kiện đi trước một bước keyup. keyupkhông giống như input, không hoạt động nếu giá trị của hộp văn bản bị thay đổi bởi bất kỳ cách nào khác, ví dụ như ràng buộc.
tinh_hunter

1
Sagar, cảm ơn bạn rất nhiều. Đây phải là Câu trả lời được chấp nhận vì đây là câu trả lời duy nhất thực sự (change)bên cạnh một cách giải quyết và sau đó là một số. Câu trả lời được chấp nhận hoàn toàn hút!
Cody

Có bất kỳ lý do cụ thể mà bạn muốn làm điều này hơn (ngModelChange)?
SnailCoil

1
Đây phải là câu trả lời được chấp nhận và an toàn nhất vì nó là bản địa và cung cấp cho bạn toàn quyền kiểm soát và nó rất biểu cảm, bởi vì tất cả mọi người đọc nó đều biết chính xác khi nào sự kiện được bắn.
Florian Leit Quay

1
@ThariqNugrohotomo Không, nó sẽ không. Sử dụng (đầu vào) nếu bạn đang tìm kiếm một cái gì đó như thế.
Sagar

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

10
hoạt động, nhưng kỳ lạ là phím backspace không được công nhận là phím bấm?
daniel

22
Bạn có thể muốn sử dụng keydownhoặc keyupthay vào đó. Một số phím không bật keypress. Xem thêm stackoverflow.com/questions/4843472/
Mạnh

Tôi đã thử keydown, keyup và thay đổi các sự kiện nhưng khi đầu vào là w, trình xử lý sự kiện báo cáo cho tôi chuỗi rỗng; khi đầu vào là chúng tôi, bộ xử lý sự kiện báo cáo cho tôi làm đầu vào. Bạn có thể vui lòng giải thích tại sao hành vi này?
sự suy tính trước

Sử dụng phím nhấn. Đầu vào chưa thay đổi khi gõ phím.
Günter Zöchbauer

1
Điều này thật lạ, nhưng tôi nhận được độ trễ đầu vào ở đây khi giá trị không chứa giá trị được nhập cho đến lần nhấn phím tiếp theo.
Matt Eland

25

Một cách khác để xử lý các trường hợp như vậy là sử dụng formControl và đăng ký nó valueChangeskhi thành phần của bạn được khởi tạo, điều này sẽ cho phép bạn sử dụng các toán tử rxjs cho các yêu cầu nâng cao như thực hiện các yêu cầu http, áp dụng gỡ lỗi cho đến khi người dùng viết xong câu, lấy giá trị cuối cùng và bỏ qua trước đó, ...

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
Đây là hoàn hảo. Điều này giúp giảm tiếng ồn trò chuyện khi sử dụng điều này cho các yêu cầu http không đồng bộ. Cũng đã thiết lập người nghe sự kiện thay đổi. Xuất sắc! Cảm ơn!
hewstone

Vui vì nó đã giúp. Cảm ơn @hewstone
Salem Ouerdani

1
Trong trường hợp có nhiều điều khiển, có thể áp dụng cùng một mã vớiFormGroup
Vikash Kumar

20

Sự kiện bí mật giữ cho đồng bộ ngModel góc cạnh là đầu vào cuộc gọi sự kiện . Do đó, câu trả lời tốt nhất cho câu hỏi của bạn nên là:

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

Nó làm cho tôi @AndreiDiaconescu
KhoPhi

Sự kiện (đầu vào) không được hỗ trợ trong trình duyệt Edge và IE. Sự thay thế cho điều này trong trình duyệt Edge là gì?
Sudhakar

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

lưu trữ .ts

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

Chào mừng bạn đến với SO Ulric, vui lòng giải thích cách mã của bạn giải quyết vấn đề.
CPHPython

4

Những gì bạn đang tìm kiếm là

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

Sau đó, làm bất cứ điều gì bạn muốn với dữ liệu bằng cách truy cập vào ràng buộc this.mymodeltrong tệp .ts của bạn.


2

Trong trường hợp của tôi, giải pháp là:

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

1

Đối với Biểu mẫu phản ứng, bạn có thể đăng ký các thay đổi được thực hiện cho tất cả các trường hoặc chỉ một trường cụ thể.

Nhận tất cả các thay đổi của Formgroup:

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

Nhận thay đổi của một lĩnh vực cụ thể:

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

0

Tôi đã sử dụng keyup trên một trường số, nhưng hôm nay tôi nhận thấy trong chrome, đầu vào có các nút tăng / giảm để tăng / giảm giá trị mà keyup không nhận ra.

Giải pháp của tôi là sử dụng keyup và thay đổi cùng nhau:

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

Các thử nghiệm ban đầu cho thấy điều này hoạt động tốt, sẽ gửi lại nếu có bất kỳ lỗi nào được tìm thấy sau khi thử nghiệm thêm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.