আমি @ ওমরাল্পারের দেওয়া উত্তরটি তৈরি করতে চাই, যা আমার মতে একটি শক্ত সমাধানের জন্য একটি ভাল ভিত্তি সরবরাহ করেছিল।
আমি যা প্রস্তাব করছি তা হ'ল সর্বশেষতম ওয়েব মান সহ একটি সরলীকৃত এবং টু ডেট সংস্করণ। এটি লক্ষ্য করা গুরুত্বপূর্ণ যে ইভেন্ট.কি কোডটি ওয়েব মান থেকে সরানো হয়েছে এবং ভবিষ্যতে ব্রাউজার আপডেটগুলি এটিকে আর সমর্থন করে না। Https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode দেখুন
তদ্ব্যতীত, পদ্ধতি
String.fromCharCode(e.keyCode);
ব্যবহারকারীর কীবোর্ডে চিহ্নিত হিসাবে প্রত্যাশিত অক্ষরে ব্যবহারকারী মানচিত্রের দ্বারা চাপানো কী-কোড সম্পর্কিত কী কোডটি গ্যারান্টি দেয় না, যেহেতু বিভিন্ন কীবোর্ড কনফিগারেশনের ফলে একটি নির্দিষ্ট কীকোডে বিভিন্ন অক্ষর দেখা দেবে। এটি ব্যবহার করে এমন বাগগুলি প্রবর্তন করা হবে যা সনাক্ত করা কঠিন এবং নির্দিষ্ট ব্যবহারকারীর জন্য কার্যকারিতা সহজেই ভেঙে দিতে পারে। বরং আমি ইভেন্ট.কি ব্যবহারের প্রস্তাব দিচ্ছি, এখানে ডক্স দেখুন https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
তদুপরি, আমরা কেবল এটিই চাই যে ফলাফল আউটপুটটি একটি বৈধ দশমিক। এর অর্থ হ'ল 1, 11.2, 5000.2341234 সংখ্যাটি গ্রহণ করা উচিত তবে 1.1.2 মানটি গ্রহণ করা উচিত নয়।
নোট করুন যে আমার সমাধানে আমি কাটা, অনুলিপি এবং কার্যকারিতা বাদ দিচ্ছি কারণ এটি বাগের জন্য উইন্ডোগুলি খোলায়, বিশেষত যখন লোকেরা সংশ্লিষ্ট ক্ষেত্রে অযাচিত পাঠ্য আটকে দেয়। এর জন্য একটি কীআপ হ্যান্ডলারের একটি ক্লিনআপ প্রক্রিয়া প্রয়োজন; যা এই থ্রেডের সুযোগ নয়।
আমি প্রস্তাব করছি সমাধান এখানে।
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
selector: '[myNumberOnly]'
})
export class NumberOnlyDirective {
private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);
private specialKeys: Array<string> = [ 'Backspace', 'Tab', 'End', 'Home' ];
constructor(private el: ElementRef) {
}
@HostListener('keydown', [ '$event' ])
onKeyDown(event: KeyboardEvent) {
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
let current: string = this.el.nativeElement.value;
let next: string = current.concat(event.key);
if (next && !String(next).match(this.regex)) {
event.preventDefault();
}
}
}