Tôi muốn xây dựng dựa trên câu trả lời được đưa ra bởi @omeralper, theo ý kiến của tôi, cung cấp một nền tảng tốt cho một giải pháp vững chắc.
Điều tôi đang đề xuất là một phiên bản đơn giản và cập nhật với các tiêu chuẩn web mới nhất. Điều quan trọng cần lưu ý là event.keycode bị loại bỏ khỏi các tiêu chuẩn web và các bản cập nhật trình duyệt trong tương lai có thể không hỗ trợ nó nữa. Xem https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Hơn nữa, phương pháp này
String.fromCharCode(e.keyCode);
không đảm bảo rằng các keyCode liên quan đến phím được nhấn bởi các bản đồ dùng để bức thư dự kiến sẽ được xác định trên bàn phím của người dùng, vì cấu hình bàn phím khác nhau sẽ cho kết quả trong một mã khóa đặc biệt khác nhau.Sử dụng điều này sẽ giới thiệu các lỗi khó xác định và có thể dễ dàng phá vỡ chức năng cho một số người dùng nhất định. Thay vào đó tôi đề xuất sử dụng event.key, hãy xem tài liệu tại đây https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
Hơn nữa, chúng tôi chỉ muốn kết quả đầu ra là một số thập phân hợp lệ. Điều này có nghĩa là các số 1, 11.2, 5000.2341234 phải được chấp nhận, nhưng giá trị 1.1.2 không được chấp nhận.
Lưu ý rằng trong giải pháp của tôi, tôi không bao gồm chức năng cắt, sao chép và dán vì nó mở cửa sổ cho các lỗi, đặc biệt khi mọi người dán văn bản không mong muốn vào các trường được liên kết. Điều đó sẽ yêu cầu một quá trình dọn dẹp trên một trình xử lý khóa; đó không phải là phạm vi của chủ đề này.
Đây là giải pháp tôi đang đề xuất.
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
selector: '[myNumberOnly]'
})
export class NumberOnlyDirective {
// Allow decimal numbers. The \. is only allowed once to occur
private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);
// Allow key codes for special events. Reflect :
// Backspace, tab, end, home
private specialKeys: Array<string> = [ 'Backspace', 'Tab', 'End', 'Home' ];
constructor(private el: ElementRef) {
}
@HostListener('keydown', [ '$event' ])
onKeyDown(event: KeyboardEvent) {
// Allow Backspace, tab, end, and home keys
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
// Do not use event.keycode this is deprecated.
// See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
let current: string = this.el.nativeElement.value;
// We need this because the current value on the DOM element
// is not yet updated with the value from this event
let next: string = current.concat(event.key);
if (next && !String(next).match(this.regex)) {
event.preventDefault();
}
}
}
Bạn có thể chỉ cần sử dụng các thuộc tính html? type = number – inoabrian
@inoabrian Tôi muốn đạt được điều này mà không cần sử dụng loại số. –
Điều này có thể giúp bạn: http: // stackoverflow.com/questions/39799436/angular-2-custom-validator-check-if-the-input-value-là-một-số nguyên – chandan7