Angular2 - ช่องป้อนข้อมูลเพื่อยอมรับเฉพาะตัวเลข


87

ใน Angular 2 ฉันจะปิดบังช่องป้อนข้อมูล (กล่องข้อความ) เพื่อให้รับเฉพาะตัวเลขไม่ใช่ตัวอักษรได้อย่างไร

ฉันมีอินพุต HTML ต่อไปนี้:

<input 
  type="text" 
  *ngSwitchDefault 
  class="form-control" 
  (change)="onInputChange()" 
  [(ngModel)]="config.Value" 
  (focus)="handleFocus($event)" 
  (blur)="handleBlur($event)"
/>

อินพุตด้านบนเป็นอินพุตข้อความทั่วไปซึ่งอาจใช้เป็นฟิลด์ข้อความธรรมดาหรือฟิลด์ตัวเลขตัวอย่างเช่นเพื่อแสดงปี

การใช้ Angular 2 ฉันจะใช้ตัวควบคุมอินพุตเดียวกันและใช้ตัวกรอง / มาสก์บางประเภทในฟิลด์นี้ได้อย่างไรเพื่อให้ยอมรับเฉพาะตัวเลข

วิธีต่างๆที่ฉันสามารถทำได้คืออะไร?

หมายเหตุ: ฉันต้องการบรรลุสิ่งนี้โดยใช้กล่องข้อความเท่านั้นและไม่ได้ใช้ประเภทหมายเลขอินพุต


1
คุณสามารถใช้แอตทริบิวต์ html ได้หรือไม่? type = number
inoabrian

@inoabrian ฉันต้องการบรรลุสิ่งนี้โดยไม่ต้องใช้ประเภทตัวเลข
Aniruddha Pondhe

สิ่งนี้อาจช่วยคุณได้: stackoverflow.com/questions/39799436/…
chandan7

คำตอบ:


112

คุณสามารถใช้คำสั่ง angular2 พลันคร

import { Directive, ElementRef, HostListener, Input } from '@angular/core';

@Directive({
  selector: '[OnlyNumber]'
})
export class OnlyNumber {

  constructor(private el: ElementRef) { }

  @Input() OnlyNumber: boolean;

  @HostListener('keydown', ['$event']) onKeyDown(event) {
    let e = <KeyboardEvent> event;
    if (this.OnlyNumber) {
      if ([46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 ||
        // Allow: Ctrl+A
        (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) ||
        // Allow: Ctrl+C
        (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) ||
        // Allow: Ctrl+V
        (e.keyCode === 86 && (e.ctrlKey || e.metaKey)) ||
        // Allow: Ctrl+X
        (e.keyCode === 88 && (e.ctrlKey || e.metaKey)) ||
        // Allow: home, end, left, right
        (e.keyCode >= 35 && e.keyCode <= 39)) {
          // let it happen, don't do anything
          return;
        }
        // Ensure that it is a number and stop the keypress
        if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
            e.preventDefault();
        }
      }
  }
}

และคุณต้องเขียนชื่อคำสั่งในข้อมูลที่คุณป้อนเป็นแอตทริบิวต์

<input OnlyNumber="true" />

อย่าลืมเขียนคำสั่งของคุณในอาร์เรย์การประกาศของโมดูลของคุณ

เมื่อใช้ regex คุณจะต้องใช้คีย์ที่ใช้งานได้

export class OnlyNumber {

  regexStr = '^[0-9]*$';
  constructor(private el: ElementRef) { }

  @Input() OnlyNumber: boolean;

  @HostListener('keydown', ['$event']) onKeyDown(event) {
    let e = <KeyboardEvent> event;
    if (this.OnlyNumber) {
        if ([46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 ||
        // Allow: Ctrl+A
        (e.keyCode == 65 && e.ctrlKey === true) ||
        // Allow: Ctrl+C
        (e.keyCode == 67 && e.ctrlKey === true) ||
        // Allow: Ctrl+V
        (e.keyCode == 86 && e.ctrlKey === true) ||
        // Allow: Ctrl+X
        (e.keyCode == 88 && e.ctrlKey === true) ||
        // Allow: home, end, left, right
        (e.keyCode >= 35 && e.keyCode <= 39)) {
          // let it happen, don't do anything
          return;
        }
      let ch = String.fromCharCode(e.keyCode);
      let regEx =  new RegExp(this.regexStr);    
      if(regEx.test(ch))
        return;
      else
         e.preventDefault();
      }
  }
}

1
เยี่ยมมาก ฉันจะทำแบบเดียวกันโดยใช้รูปแบบ RegEx ได้อย่างไร
Aniruddha Pondhe

3
ไม่อนุญาตให้คัดลอกวาง
Shardul

@Shardul เพียงแค่เพิ่ม(e.keyCode == 86 && e.ctrlKey === true)เงื่อนไขการคัดลอกใช้งานได้ แต่การวางไม่ทำงาน
Al-Mothafar

1
ฉันจะเพิ่มช่องว่างบวก & ลบได้อย่างไร
Zahidul Islam Ruhel

1
keyCode
Deprecated

65

หากคุณไม่ต้องการคำสั่ง

https://stackblitz.com/edit/numeric-only

ใน component.html

<input (keypress)="numberOnly($event)" type="text">

ใน component.ts

export class AppComponent {

  numberOnly(event): boolean {
    const charCode = (event.which) ? event.which : event.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
      return false;
    }
    return true;

  }
}

34
ปัญหาของแนวทางนี้คือเหตุการณ์สำคัญไม่จับภาพผู้ใช้วางหรือเบราว์เซอร์กรอกข้อมูลในช่องป้อนข้อมูลโดยอัตโนมัติ นี่จึงเป็นวิธีแก้ปัญหาที่ไม่ดี
Darryn Hosking

30

ฉันรู้ว่านี่เป็นคำถามเก่า แต่เนื่องจากนี่เป็นเรื่องสนุกทั่วไปฉันจึงต้องการแบ่งปันการปรับเปลี่ยนที่ฉันทำ:

  • ตัวคั่นทศนิยมที่กำหนดเอง (จุดหรือลูกน้ำ)
  • รองรับจำนวนเต็มเท่านั้นหรือจำนวนเต็มและทศนิยม
  • รองรับเฉพาะจำนวนบวกหรือบวกและลบ
  • ตรวจสอบเครื่องหมายลบ (-) อยู่ในจุดเริ่มต้น
  • รองรับการวางเมาส์ (มีข้อ จำกัด บางประการแม้ว่าhttps://caniuse.com/#feat=clipboard )
  • รองรับปุ่มคำสั่ง Mac
  • แทนที่สตริงเช่น ".33" และ "33" สำหรับเวอร์ชันที่ถูกต้อง: 0.33 และ 33.0

    import { Directive, ElementRef, HostListener, Input } from '@angular/core';
    
    @Directive({ selector: '[NumbersOnly]' })
    export class NumbersOnly { 
    
        @Input() allowDecimals: boolean = true;
        @Input() allowSign: boolean = false;
        @Input() decimalSeparator: string = '.';
    
        previousValue: string = '';
    
        // --------------------------------------
        //  Regular expressions
        integerUnsigned: string = '^[0-9]*$';
        integerSigned: string = '^-?[0-9]+$';
        decimalUnsigned: string = '^[0-9]+(.[0-9]+)?$';
        decimalSigned: string = '^-?[0-9]+(.[0-9]+)?$';
    
        /**
         * Class constructor
         * @param hostElement
         */
        constructor(private hostElement: ElementRef) { }
    
        /**
         * Event handler for host's change event
         * @param e
         */
        @HostListener('change', ['$event']) onChange(e) {
    
                this.validateValue(this.hostElement.nativeElement.value);
    }
    
    /**
     * Event handler for host's paste event
     * @param e
     */
    @HostListener('paste', ['$event']) onPaste(e) {
    
        // get and validate data from clipboard
        let value = e.clipboardData.getData('text/plain');
        this.validateValue(value);
        e.preventDefault();
    }
    
    /**
     * Event handler for host's keydown event
     * @param event
     */
    @HostListener('keydown', ['$event']) onKeyDown(e: KeyboardEvent) {
    
        let cursorPosition: number = e.target['selectionStart'];
        let originalValue: string = e.target['value'];
        let key: string = this.getName(e);
        let controlOrCommand = (e.ctrlKey === true || e.metaKey === true);
        let signExists = originalValue.includes('-');
        let separatorExists = originalValue.includes(this.decimalSeparator);
    
        // allowed keys apart from numeric characters
        let allowedKeys = [
            'Backspace', 'ArrowLeft', 'ArrowRight', 'Escape', 'Tab'
        ];
    
        // when decimals are allowed, add
        // decimal separator to allowed codes when
        // its position is not close to the the sign (-. and .-)
        let separatorIsCloseToSign = (signExists && cursorPosition <= 1);
        if (this.allowDecimals && !separatorIsCloseToSign && !separatorExists) {
    
            if (this.decimalSeparator == '.')
                allowedKeys.push('.');
            else
                allowedKeys.push(',');
        }
    
        // when minus sign is allowed, add its
        // key to allowed key only when the
        // cursor is in the first position, and
        // first character is different from
        // decimal separator
        let firstCharacterIsSeparator = (originalValue.charAt(0) != this.decimalSeparator);
        if (this.allowSign && !signExists &&
            firstCharacterIsSeparator && cursorPosition == 0) {
    
            allowedKeys.push('-');
        }
    
        // allow some non-numeric characters
        if (allowedKeys.indexOf(key) != -1 ||
            // Allow: Ctrl+A and Command+A
            (key == 'a' && controlOrCommand) ||
            // Allow: Ctrl+C and Command+C
            (key == 'c' && controlOrCommand) ||
            // Allow: Ctrl+V and Command+V
            (key == 'v' && controlOrCommand) ||
            // Allow: Ctrl+X and Command+X
            (key == 'x' && controlOrCommand)) {
            // let it happen, don't do anything
            return;
        }
    
        // save value before keydown event
        this.previousValue = originalValue;
    
        // allow number characters only
        let isNumber = (new RegExp(this.integerUnsigned)).test(key);
        if (isNumber) return; else e.preventDefault();
    }
    
    /**
     * Test whether value is a valid number or not
     * @param value
     */
    validateValue(value: string): void {
    
        // choose the appropiate regular expression
        let regex: string;
        if (!this.allowDecimals && !this.allowSign) regex = this.integerUnsigned;
        if (!this.allowDecimals && this.allowSign) regex = this.integerSigned;
        if (this.allowDecimals && !this.allowSign) regex = this.decimalUnsigned;
        if (this.allowDecimals &&  this.allowSign) regex = this.decimalSigned;
    
        // when a numbers begins with a decimal separator,
        // fix it adding a zero in the beginning
        let firstCharacter = value.charAt(0);
        if (firstCharacter == this.decimalSeparator)
            value = 0 + value;
    
        // when a numbers ends with a decimal separator,
        // fix it adding a zero in the end
        let lastCharacter = value.charAt(value.length-1);
        if (lastCharacter == this.decimalSeparator)
            value = value + 0;
    
        // test number with regular expression, when
        // number is invalid, replace it with a zero
        let valid: boolean = (new RegExp(regex)).test(value);
        this.hostElement.nativeElement['value'] = valid ? value : 0;
    }
    
    /**
     * Get key's name
     * @param e
     */
    getName(e): string {
    
        if (e.key) {
    
            return e.key;
    
        } else {
    
            // for old browsers
            if (e.keyCode && String.fromCharCode) {
    
                switch (e.keyCode) {
                    case   8: return 'Backspace';
                    case   9: return 'Tab';
                    case  27: return 'Escape';
                    case  37: return 'ArrowLeft';
                    case  39: return 'ArrowRight';
                    case 188: return ',';
                    case 190: return '.';
                    case 109: return '-'; // minus in numbpad
                    case 173: return '-'; // minus in alphabet keyboard in firefox
                    case 189: return '-'; // minus in alphabet keyboard in chrome
                    default: return String.fromCharCode(e.keyCode);
                }
            }
        }
    }
    

การใช้งาน:

 <input NumbersOnly
        [allowDecimals]="true"
        [allowSign]="true"
        type="text">

ฉันเปลี่ยนบรรทัดสุดท้ายของวิธี validatevalue เพื่อป้องกันการเพิ่มศูนย์สำหรับการวางที่ไม่ถูกต้อง if (valid) {this.hostElement.nativeElement ['value'] = value;}
Abdul Rehman Sayed

คุณช่วยเพิ่มการตรวจสอบการลากและวางด้วยได้ไหม นอกจากนี้ฉันสังเกตเห็นว่าค่าช่องป้อนข้อมูลเปลี่ยนเป็นค่าเบาะ 0 สำหรับตัวคั่นทศนิยมนำหน้าและต่อท้าย แต่ค่าไม่อัปเดตในตัวแปรการผูกสองทาง ตัวอย่างเช่น: [(NgModel)] = "myVariable" ที่นี่ถ้าเราพิมพ์. 3 ในช่องอินพุตค่าในการป้อนข้อความจะเปลี่ยนเป็น 0.3 เมื่อเบลอ แต่ค่าใน myVariable ยังคงเป็น ".3"
Sushmit Sagar

อินพุตลบและ Enter หายไป แต่อย่างไรก็ตามวิธีแก้ปัญหานั้นดีมาก
Oleg Bondarenko

29

ฉันต้องการสร้างคำตอบที่ได้รับจาก @omeralper ซึ่งในความคิดของฉันเป็นรากฐานที่ดีสำหรับการแก้ปัญหาที่มั่นคง

สิ่งที่ฉันเสนอคือเวอร์ชันที่เรียบง่ายและทันสมัยพร้อมมาตรฐานเว็บล่าสุด สิ่งสำคัญคือต้องทราบว่า event.keycode ถูกลบออกจากมาตรฐานของเว็บและการอัปเดตเบราว์เซอร์ในอนาคตอาจไม่รองรับอีกต่อไป ดูhttps://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

นอกจากนี้วิธีการ

String.fromCharCode(e.keyCode);

ไม่รับประกันว่า keyCode ที่เกี่ยวข้องกับคีย์ที่กดโดยผู้ใช้จะจับคู่กับตัวอักษรที่คาดไว้ตามที่ระบุบนแป้นพิมพ์ของผู้ใช้เนื่องจากการกำหนดค่าแป้นพิมพ์ที่แตกต่างกันจะส่งผลให้คีย์โค้ดเฉพาะอักขระต่างกัน การใช้สิ่งนี้จะแนะนำจุดบกพร่องที่ยากต่อการระบุและสามารถทำลายฟังก์ชันการทำงานสำหรับผู้ใช้บางรายได้อย่างง่ายดาย แต่ฉันกำลังเสนอการใช้ event.key ดูเอกสารที่นี่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 {
    // 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();
        }
    }
}

นี่เป็นแนวทางที่น่าสนใจจริงๆ คุณมีข้อเสนอแนะเกี่ยวกับวิธีใช้ฟังก์ชันการคัดลอก / วางโดยไม่ต้องใช้วิธีการที่เก่ากว่าเช่น (e.keyCode == 67 && e.ctrlKey === จริง) ??
Ender2050

1
ฉันไม่ได้ลองสิ่งนี้เป็นการส่วนตัว แต่คุณสามารถฟังเหตุการณ์คัดลอก / วางที่ทริกเกอร์ได้ในทำนองเดียวกัน พวกเขาสร้าง ClipboardEvent ( developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent ) ซึ่งมีข้อมูลที่กำลังคัดลอก / วาง ข้อเสียเปรียบเพียงประการเดียวคือยังอยู่ในช่วงทดลองและรองรับโดยเบราว์เซอร์รุ่นล่าสุดเท่านั้น - caniuse.com/#search=paste
JeanPaul อ.

ฉันลองใช้วิธีการที่คล้ายกัน แต่น่าเสียดายที่วิธีนี้ใช้ไม่ได้กับทุกกรณี ตัวแปร "next" ของคุณจะถือว่าอักขระที่ถูกกดจะอยู่ที่ส่วนท้ายของค่าที่พิมพ์ในปัจจุบัน นี่ไม่ใช่กรณีเสมอไป ตัวอย่างเช่นถ้ามีคนพิมพ์ 100 แล้วตัดสินใจที่จะทำให้เป็น 1100 โดยต่อท้าย 1 ไว้ข้างหน้า ตัวแปร "ถัดไป" ของคุณจะไม่ถูกต้อง (1001)
Carlos Rodriguez

เนื่องจากค่า 'ถัดไป' ใช้เพื่อตรวจสอบว่าจำนวนที่ป้อนเป็นทศนิยมที่ถูกต้องหรือไม่ (และไม่ต้องกำหนดค่า) การต่อท้ายค่านี้จะไม่เปลี่ยนแปลงการตรวจสอบความถูกต้องของ regex
JeanPaul

ฉันต้องการเพิ่มบรรทัดนี้เพื่อใช้ในการควบคุมอินพุตเท่านั้น <input myNumberOnly type = "text" id = "yourId">
Lrodriguez84

17

โซลูชันที่รัดกุมยิ่งขึ้น ลองใช้คำสั่งนี้

สามารถใช้ได้หากคุณใช้ ReactiveForms

export class NumberOnlyDirective {
  private el: NgControl;

  constructor(private ngControl: NgControl) {
    this.el = ngControl;
  }

  // Listen for the input event to also handle copy and paste.
  @HostListener('input', ['$event.target.value'])
  onInput(value: string) {
    // Use NgControl patchValue to prevent the issue on validation
    this.el.control.patchValue(value.replace(/[^0-9]/g, ''));
  }
}

ใช้กับอินพุตของคุณเช่นนี้:

<input matInput formControlName="aNumberField" numberOnly>

1
ในขณะที่โซลูชันนี้ใช้งานได้ แต่จะทริกเกอร์เหตุการณ์การเปลี่ยนแปลงโมเดลสองครั้งซึ่งกล่าวว่าวิธีการใช้ regex เป็นวิธีที่ถูกต้องนี่คือเวอร์ชันที่ไม่เริ่มการทำงานของโมเดลที่เปลี่ยนแปลงเหตุการณ์สองครั้ง: stackblitz.com/edit/…
ntziolis

ถึงความคิดเห็นของ ntziolis: จนถึงตอนนี้วิธีแก้ปัญหาของ Ben Gulapa ก็ใช้ได้ผลสำหรับฉัน แต่วิธีการแก้ปัญหาที่อ้างอิงโดย ntziolis ไม่ใช่ ยกโทษให้ฉันถ้าฉันผิด แต่ดูเหมือนว่าปัญหาเกี่ยวกับรหัสที่ลิงค์ด้านบนไปยัง stackblitz อย่างน้อยสำหรับฉันคืออักขระที่ไม่ต้องการตัวสุดท้ายที่ฉันพิมพ์แม้ว่ามันจะไม่ปรากฏในอินเทอร์เฟซผู้ใช้เลยก็ตาม ใส่ลงในตัวแปรขอบเขตของส่วนประกอบของฉัน เพียงอักขระสุดท้ายที่ไม่ต้องการ
user2367418

เพื่อดำเนินการต่อความคิดเห็นของฉัน: การใช้ Angular 7 และข้อความอินพุต HMTL จำกัด ไว้ที่สองอักขระ
user2367418

15
<input type="text" (keypress)="keyPress($event)">


  keyPress(event: any) {
    const pattern = /[0-9\+\-\ ]/;

    let inputChar = String.fromCharCode(event.charCode);
    if (event.keyCode != 8 && !pattern.test(inputChar)) {
      event.preventDefault();
    }
  }

14

คุณต้องใช้ type = "number" แทนข้อความ คุณยังสามารถระบุจำนวนสูงสุดและต่ำสุดได้

<input type="number" name="quantity" min="1" max="5">

2
ฉันต้องการบรรลุสิ่งนี้โดยไม่ต้องใช้ประเภทตัวเลข
Aniruddha Pondhe

3
การรองรับประเภทตัวเลขยังค่อนข้างบั๊กตามที่อธิบายไว้ในคำตอบนี้: stackoverflow.com/a/14995890/1156185
Nicolas Forney

9
ข้อเสียtype="number"คือยอมรับตัวอักษรeเป็นส่วนหนึ่งของสัญกรณ์วิทยาศาสตร์
user776686

12

คุณสามารถทำได้เช่นนี้

<input type="text" pInputText (keypress)="onlyNumberKey($event)" maxlength="3"> 

onlyNumberKey(event) {
    return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57;
}

//for Decimal you can use this as

onlyDecimalNumberKey(event) {
    let charCode = (event.which) ? event.which : event.keyCode;
    if (charCode != 46 && charCode > 31
        && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

หวังว่านี่จะช่วยคุณได้


คุณช่วยอธิบายให้ละเอียดได้ไหม event.charCode == 8 กำลังทำอะไรอยู่
bosari

10

คุณสามารถใช้ regex:

<input type="text" (keypress)="numericOnly($event)">

numericOnly(event): boolean {    
    let patt = /^([0-9])$/;
    let result = patt.test(event.key);
    return result;
}

1
ใช่มันมีประโยชน์ แต่ฉันต้องการ (.) ทศนิยมด้วยในช่องป้อนข้อมูลของฉัน
rinku Choudhary

6

ใช้patternแอตทริบิวต์สำหรับการป้อนข้อมูลดังต่อไปนี้:

<input type="text" pattern="[0-9]+" >

มันไม่ทำงาน. เมื่อคุณเริ่มพิมพ์คุณพิมพ์อักขระที่ไม่ถูกต้อง
Seyed-Amir-Mehrizi

6

ฉันรู้ว่านี่มีคำตอบมากมาย แต่ฉันจำเป็นต้องจัดการสิ่งต่อไปนี้ (ซึ่งดูเหมือนว่าไม่มีคำตอบใดที่จะสนับสนุนอย่างเต็มที่):

  • รองรับ textarea พร้อมตัวเลือกสำหรับหลายบรรทัด
  • ทศนิยมหรือจำนวนลบ
  • ความยาวสูงสุดต่อบรรทัด
  • รองรับข้ามเบราว์เซอร์ (Chrome, Edge, IE 11)
  • การจัดการการดำเนินการตัด / วางและเหตุการณ์

วิธีแก้ปัญหาช่วยให้ฉันสามารถกำหนดพื้นที่ข้อความได้ดังนี้:

<textarea class="form-control" [(ngModel)]="this.myModelVariable"
    appOnlyNumbers [allowNegative]="true" [allowMultiLine]="true" 
    [allowDecimal]="true" [maxLength]="10"
    placeholder="Enter values (one per line)"></textarea>

หรือถ้าผมอยากได้แค่จำนวนเต็มบวก

<textarea class="form-control" [(ngModel)]="this.myModelVariable"
    appOnlyNumbers [allowMultiLine]="true" [maxLength]="9"
    placeholder="Enter values (one per line)"></textarea>

นี่คือคำสั่งของฉัน:

import { Directive, HostListener, Input, ElementRef } from '@angular/core';

@Directive({
  selector: '[appOnlyNumbers]'
})
export class OnlyNumbersDirective {
  constructor(private el: ElementRef) { }

  @Input() allowMultiLine: boolean = false;
  @Input() allowNegative: boolean = false;
  @Input() allowDecimal: boolean = false;
  @Input() maxLength: number = 0;
  regex: RegExp;

  @HostListener('keypress', ['$event'])
  onKeyPress(event: KeyboardEvent) {
    this.validate(event, event.key === 'Enter' ? '\n' : event.key);
  }

  @HostListener('paste', ['$event'])
  onPaste(event: Event) {
    const pastedText = (<any>window).clipboardData && (<any>window).clipboardData.getData('Text') // If IE, use window
      || <ClipboardEvent>event && (<ClipboardEvent>event).clipboardData.getData('text/plain'); // Non-IE browsers
    this.validate(event, pastedText);
  }

  @HostListener('cut', ['$event'])
  onCut(event: Event) {
    this.validate(event, '');
  }

  validate(event: Event, text: string) {
    const txtInput = this.el.nativeElement;
    const newValue = (txtInput.value.substring(0, txtInput.selectionStart)
      + text + txtInput.value.substring(txtInput.selectionEnd));
    if (!this.regex) {
      this.regex = <RegExp>eval('/^'
        + (this.allowNegative ? '-?' : '')
        + (this.allowDecimal ? '((\\d+\\.?)|(\\.?))\\d*' : '\\d*')
        + '$/g');
    }
    var lines = this.allowMultiLine ? newValue.split('\n') : [newValue];
    for (let line of lines) {
      let lineText = line.replace('\r', '');
      if (this.maxLength && lineText.length > this.maxLength || !lineText.match(this.regex)) {
        event.preventDefault();
        return;
      }
    }
  }

}

4

เพื่อให้บรรลุเป้าหมายนี้ฉันผูกฟังก์ชันกับเมธอด onInput ดังนี้:

(input)="stripText(infoForm.get('uin'))

นี่คือตัวอย่างในแบบฟอร์มของฉัน:

<form [formGroup]="infoForm" (submit)="next()" class="ui form">
    <input type="text" formControlName="uin" name="uin" id="uin" (input)="stripText(infoForm.get('uin'))" required/>
</form>

จากนั้นฉันเพิ่มฟังก์ชันต่อไปนี้ในส่วนประกอบของฉัน:

  stripText(control: FormControl) {
   control.setValue(control.value.replace(/[^0-9]/g, ''));
  }

regex นี้/[^0-9]/gค้นหาสิ่งที่ไม่ใช่ตัวเลขและ.replaceฉันตั้งค่าให้แทนที่โดยไม่มีอะไร ดังนั้นเมื่อผู้ใช้พยายามพิมพ์อักขระที่ไม่ใช่ตัวเลข (ในกรณีนี้คืออักขระที่ไม่ใช่ศูนย์ถึงเก้า) ดูเหมือนว่าไม่มีอะไรเกิดขึ้นในกล่องข้อความ


4

ขอบคุณ JeanPaul A. และ rdanielmurphy ฉันได้สร้างคำสั่งที่กำหนดเองของฉันเองเพื่อ จำกัด ช่องป้อนข้อมูลเป็นตัวเลขเท่านั้น ยังเพิ่มแอตทริบิวต์อินพุตสูงสุดและต่ำสุด จะทำงานในเชิงมุม 7 ด้วย

เชิงมุม

    import { Directive, ElementRef, Input, HostListener } from '@angular/core';

@Directive({
  selector: '[appNumberOnly]'
})
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) { }

  @Input() maxlength: number;
  @Input() min: number;
  @Input() max: number;

  @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
    const 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
    const next: string = current.concat(event.key);
    if (next && !String(next).match(this.regex) || (this.maxlength && next.length > this.maxlength) ||
      (this.min && +next < this.min) ||
      (this.max && +next >= this.max)) {
      event.preventDefault();
    }
  }

  @HostListener('paste', ['$event']) onPaste(event) {
    // Don't allow pasted text that contains non-numerics
    const pastedText = (event.originalEvent || event).clipboardData.getData('text/plain');

    if (pastedText) {
      const regEx = new RegExp('^[0-9]*$');
      if (!regEx.test(pastedText) || (this.maxlength && pastedText.length > this.maxlength) ||
        (this.min && +pastedText < this.min) ||
        (this.max && +pastedText >= this.max)) {
        event.preventDefault();
      }
    }
  }

}

HTML

<input type="text" class="text-area" [(ngModel)]="itemName" maxlength="3" appNumberOnly />

4

แนวทางที่ทันสมัยสำหรับคำตอบที่ดีที่สุด (โดยไม่ต้องใช้ e.keyCode ที่เลิกใช้แล้ว):

@HostListener('keydown', ['$event']) onKeyDown(event) {
    let e = <KeyboardEvent> event;
    if (['Delete', 'Backspace', 'Tab', 'Escape', 'Enter', 'NumLock', 'ArrowLeft', 'ArrowRight', 'End', 'Home', '.'].indexOf(e.key) !== -1 ||
      // Allow: Ctrl+A
      (e.key === 'a' && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+C
      (e.key === 'c' && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+V
      (e.key === 'v' && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+X
      (e.key === 'x' && (e.ctrlKey || e.metaKey))) {
      // let it happen, don't do anything
      return;
    }
    // Ensure that it is a number and stop the keypress
    if ((e.shiftKey || ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].indexOf(e.key) === -1)) {
      e.preventDefault();
    }
}

1
นี่มันเจ๋งมาก! @Directive ({selector: "[inputNumericInput]"}) เอ็กซ์พอร์ตคลาส NumericInputDirective {@HostListener ()}
เนท

2
ทำได้ดี. เฉพาะผลข้างเคียงที่พบในการคัดลอกวาง อนุญาตให้คัดลอกวางสตริงที่ไม่ใช่ตัวเลขภายนอก Googled และพบทางออกที่ดีกว่าซึ่งอยู่นี้ @ stackblitz.com/edit/...
vinsinraw

4

คำสั่ง RegExp โดยพลการ

นี่คือคำสั่งเล็ก ๆที่ใช้ regexp โดยพลการและบล็อกผู้ใช้เพื่อพิมพ์ค่าที่ไม่ถูกต้อง

หากต้องการปิดบังเฉพาะตัวเลขให้ใช้

<input [allowedRegExp]="'^[0-9]*$'" type="text" ... >

โชคไม่ดีที่คุณสามารถหลอกล่อโซลูชันนี้ได้โดยการสแปมเซอร์คัมเฟลกซ์ + สิ่งที่คุณต้องการเขียน
ProgFroz

3

เพียงสร้างคำสั่งและเพิ่ม hostlistener ด้านล่าง:

@HostListener('input', ['$event'])
    onInput(event: Event) {
        this.elementRef.nativeElement.value = (<HTMLInputElement>event.currentTarget).value.replace(/[^0-9]/g, '');
    }

แทนที่ข้อความที่ไม่ถูกต้องด้วยว่างเปล่า ตอนนี้คีย์และคีย์ผสมทั้งหมดจะใช้ได้กับทุกเบราว์เซอร์จนถึง IE9


ถ้าเริ่มพิมพ์ด้วยถ่าน char จะไม่ต่อท้าย แต่การนับความยาวของโมเดลใช้เวลา 1 จะแก้อย่างไร?. นอกจากนี้หากองค์ประกอบมีความยาวสูงสุดให้คัดลอกและวางเนื้อหาแบบผสมจำนวนโมเดลจะเป็นความยาวสูงสุด ตัวอย่างเช่นความยาวสูงสุดมี 10 จากนั้นคัดลอกและวาง 1238261jhgjh12987 ในอินพุตจะต่อท้าย 123816 เท่านั้น แต่ความยาวของโมเดลจะใช้ 10 วิธีแก้ปัญหาใด ๆ ?
Satheesh Natarajan

3

รูปแบบสำหรับรูปแบบหมายเลขโทรศัพท์มือถือที่ถูกต้อง ('^ ((\ + 91 -?) | 0)? [0-9] {10} $')

รูปแบบสำหรับยอมรับเฉพาะตัวเลขจากรูปแบบกล่องข้อความ ('[0-9] *')

รูปแบบสำหรับยอมรับเฉพาะหมายเลขที่มีหมายเลขเฉพาะเช่น: Pincode รูปแบบ ('^ [0-9] {5} $')


3
  1. <input oninput="this.value=this.value.replace(/[^0-9]/g,'')"

หรือ: 2. ในไฟล์ HTML:

 <input [(ngModel)]="data" (keypress)="stripText($event)"
     class="form-control">

ในไฟล์ ts:

stripText(event) {
const seperator  = '^([0-9])';
const maskSeperator =  new RegExp(seperator , 'g');  
let result =maskSeperator.test(event.key);   return result;   }

2 วิธีนี้ใช้ได้ผล


โปรดใช้บล็อกโค้ดเพื่อจัดรูปแบบข้อมูลโค้ดของคุณ
YuS

2

ฉันได้ทำการแก้ไขบางอย่างในคำสั่งข้างต้นและใช้งาน min, max, maxlength

   import { Directive, ElementRef, HostListener, Input } from '@angular/core';

@Directive({
  selector: '[numberOnly]'
})
export class NumbersOnlyDirective {

  private regex: RegExp = new RegExp(/[0-9]/g);
  // Allow key codes for special events. Reflect :
  private specialKeys: Array<number> = [46, 8, 9, 27, 13, 110, 190, 35, 36, 37, 39];
  // Backspace, tab, end, home

  @Input() maxlength: number;
  @Input() min: number;
  @Input() max: number;

  constructor(private el: ElementRef) {
  }
    @HostListener('keydown', ['$event'])
    onKeyDown(event: KeyboardEvent) {
    e = <KeyboardEvent>event;

if ((
  (this.specialKeys.indexOf(event.which) > -1) ||
  // to allow backspace, enter, escape, arrows  
  (e.which == 65 && e.ctrlKey == true) ||
  // Allow: Ctrl+C        
  (e.which == 67 && e.ctrlKey == true) ||
  // Allow: Ctrl+X
  (e.which == 88 && e.ctrlKey == true))) {
  return;
} else if (// to allow numbers  
  (e.which >= 48 && e.which <= 57) ||
  // to allow numpad number  
  (event.which >= 96 && event.which <= 105)) { }
else {
      event.preventDefault();
    }
    let current: string = this.el.nativeElement.value;

    let next: string = current.concat(event.key);
    if ((next && !String(next).match(this.regex)) ||
      (this.maxlength && next.length > this.maxlength) ||
      (this.min && +next < this.min) ||
      (this.max && +next >= this.max)) {
      event.preventDefault();
    }

  }
}

วิธีให้ค่าความยาวสูงสุดจากช่องป้อนข้อมูล
Jason Brody

<input id = "COMN" class = "wb-e-inp-1__input" type = "text" appNumberOnly maxlength = "10" /> working
Jason Brody

2

แคสต์เพราะทำงานร่วมกับ 0 นำหน้าเช่น 00345

@Directive({
  selector: '[appOnlyDigits]'
})
export class AppOnlyDigitsDirective {
  @HostListener('input', ['$event'])
  onKeyDown(ev: KeyboardEvent) {
    const input = ev.target as HTMLInputElement;
    input.value = String(input.value.replace(/\D+/g, ''));
  }
}

1

จากคำตอบของ @omeralper ฉันเปลี่ยนแปลงเล็กน้อยที่ไม่ยอมรับช่วงเวลา ascii (รหัสคีย์ 110,190) และใช้ให้ ch = (e.key); เพื่อเปรียบเทียบกับนิพจน์ทั่วไปเมื่อคุณเปลี่ยนภาษา (เช่นภาษาไทยหรือภาษาญี่ปุ่น) จะไม่ยอมรับลักษณะของภาษาเหล่านั้น

export class OnlyNumber {

  regexStr = '^[0-9]*$';
  constructor(private el: ElementRef) { }

  @Input() OnlyNumber: boolean;

  @HostListener('keydown', ['$event']) onKeyDown(event) {
    let e = <KeyboardEvent> event;
    if (this.OnlyNumber) {
      // console.log(event, this.OnlyNumber);
        if ([46, 8, 9, 27, 13].indexOf(e.keyCode) !== -1) {
          return;
        }
      let ch = (e.key);
      let regEx =  new RegExp(this.regexStr);   
      if(regEx.test(ch))
        return;
      else
         e.preventDefault();
    }
  }
}

หวังว่าจะช่วยได้ :)


1

คุณสามารถสร้าง Validator นี้และนำเข้าในคอมโพเนนต์ของคุณ
โดยทั่วไปตรวจสอบสตริงอินพุตแบบฟอร์ม:

  • ตรวจสอบว่าไม่มีจุด
  • แปลงสตริงเป็นตัวเลข
  • ตรวจสอบเป็นจำนวนเต็ม
  • ตรวจสอบมากกว่าศูนย์

ในการนำไปใช้ในโครงการของคุณ:

  1. เส้นทางที่แนะนำในโฟลเดอร์แอปของคุณ: src / app / validators / number.validator.ts
  2. นำเข้าในส่วนประกอบของคุณ

    import { NumberValidator } from '../../validators/number.validator';

  3. เพิ่มลงในตัวควบคุมฟอร์ม
    inputNumber: ['', [NumberValidator.isInteger]],
  4. หากคุณไม่ต้องการแสดงถ่านที่ไม่ถูกต้องให้ผูก a (change)="deleteCharIfInvalid()"กับอินพุตถ้าform.get('inputNumber').hasError('isInteger')เป็น trueให้ลบถ่านสุดท้ายที่แทรก
// FILE: src/app/validators/number.validator.ts

import { FormControl } from '@angular/forms';

export interface ValidationResult {
    [key: string]: boolean;
}

export class NumberValidator {

    public static isInteger(control: FormControl): ValidationResult {
        // check if string has a dot
        let hasDot:boolean = control.value.indexOf('.') >= 0 ? true : false;
        // convert string to number
        let number:number = Math.floor(control.value);
        // get result of isInteger()
        let integer:boolean = Number.isInteger(number);
        // validate conditions 
        let valid:boolean = !hasDot && integer && number>0;
        console.log('isInteger > valid', hasDot, number, valid);
        if (!valid) {
            return { isInteger: true };
        }
        return null;
    }        
}

จะไม่Number.isInteger(Math.floor(control.value))เป็นจริงเสมอไป? ผมว่าน่าจะparseFloatแทนได้
AndyTheEntity

1

ด้วยการสนับสนุนการฆ่าเชื้อเนื้อหาที่วาง:

import { Directive, ElementRef, HostListener, Input } from '@angular/core';

@Directive({
  selector: '[NumbersOnly]'
})
export class NumbersOnlyDirective {

    DIGITS_REGEXP =  new RegExp(/\D/g);
    constructor(private el: ElementRef) { 

        // Sanatize clipboard by removing any non-numeric input after pasting
        this.el.nativeElement.onpaste = (e:any) => {
            e.preventDefault();
            let text;
            let clp = (e.originalEvent || e).clipboardData;
            if (clp === undefined || clp === null) {
                text = (<any>window).clipboardData.getData('text') || '';
                if (text !== '') {
                    text = text.replace(this.DIGITS_REGEXP, '');
                    if (window.getSelection) {
                        let newNode = document.createElement('span');
                        newNode.innerHTML = text;
                        window.getSelection().getRangeAt(0).insertNode(newNode);
                    } else {
                        (<any>window).selection.createRange().pasteHTML(text);
                    }
                }
            } else {
                text = clp.getData('text/plain') || '';
                if (text !== '') {
                    text = text.replace(this.DIGITS_REGEXP, '');
                    document.execCommand('insertText', false, text);
                }
            }
        };
    }

  @HostListener('keydown', ['$event']) onKeyDown(event) {
    let e = <KeyboardEvent> event;
    if ([46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 ||
      // Allow: Ctrl+A
      (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+C
      (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+V
      (e.keyCode === 86 && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+X
      (e.keyCode === 88 && (e.ctrlKey || e.metaKey)) ||
      // Allow: home, end, left, right
      (e.keyCode >= 35 && e.keyCode <= 39)) {
        // let it happen, don't do anything
        return;
      }
      // Ensure that it is a number and stop the keypress
      if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
          e.preventDefault();
      }
    }

}

1

นี่เป็นเรื่องง่าย: คำสั่งง่ายๆในเหตุการณ์คีย์ดาวน์จะตรวจสอบความยาวของคีย์คือหนึ่งและคีย์ไม่ใช่ตัวเลขpreventDefault()และจะไม่แสดงผลอักขระนั้น

import {Directive, ElementRef, HostListener} from '@angular/core';

@Directive({
    selector: '[numbersOnly]'
})
export class NumbersOnlyDirective {
    @HostListener('keydown', ['$event'])
    keyDownEvent(event: KeyboardEvent) {
        if (event.key.length === 1 && (event.which < 48 || event.which > 57)) {
            event.preventDefault();
        }
    }

}

HTML:

<input type="text" [(ngModel)]="numModel" numbersOnly />

ข้อ จำกัด : มันจะอนุญาตให้วางโดยใช้เมาส์เพื่อที่จะยอมรับถ่านอื่น ๆ เพื่อหลีกเลี่ยงไม่ให้คุณส่งโมเดลเป็นอินพุตไปยังคำสั่งและngOnChageค่าการเปลี่ยนแปลงโมเดลนั้นเป็นตัวเลขเท่านั้น:

ชอบด้านล่าง:

แก้ไข: เพิ่มรหัสเพื่อตรวจจับการเปลี่ยนแปลงในโมเดลและอัปเดตค่าของอินพุต

import {Directive, ElementRef, HostListener, Input, OnChanges} from '@angular/core';

@Directive({
    selector: '[numbersOnly]'
})
export class NumbersOnlyDirective implements OnChanges {

    @Input() numbersOnly: any;

    constructor(private el: ElementRef) {}

    @HostListener('keydown', ['$event'])
    keyDownEvent(event: KeyboardEvent) {
        // Add other conditions if need to allow ctr+c || ctr+v
        if (event.key.length === 1 && (event.which < 48 || event.which > 57)) {
            event.preventDefault();
        }
    }

    ngOnChanges(changes) {
        if (changes.numbersOnly) {
            this.el.nativeElement.value = this.el.nativeElement.value.replace(/[^0-9]/g, '');
        }
    }

}

HTML:

<input type="text" [(ngModel)]="numModel" [numbersOnly]="numModel" />

ถ้าเริ่มพิมพ์ด้วย char, char จะไม่ต่อท้าย แต่การนับความยาวของโมเดลใช้เวลา 1 จะแก้อย่างไร?
Satheesh Natarajan

คุณตรวจสอบความยาวเมื่อใดความยาวยังคงเป็น 0 ในคำสั่งก่อนและหลังทำการเปลี่ยนแปลง หากถึงจุดหนึ่งมันควรจะกลับมาที่ 0 อย่างรวดเร็ว
Lahar Shah

ไม่มันไม่ใช่. ลองผูก numModel.length ในเทมเพลตและตรวจสอบจำนวนความยาว
Satheesh Natarajan

1
 import {Directive, ElementRef, HostListener, Output, EventEmitter} from '@angular/core';


    //only-digits
    @Directive({
      selector: '[only-digits]'
    })
    export class OnlyDigits {

      constructor(public el: ElementRef) {

        this.el.nativeElement.onkeypress = (evt) => {
          if (evt.which < 48 || evt.which > 57) {
            evt.preventDefault();
          }
        };

      }
    }

Directive ก็เป็นวิธีที่ดีที่สุดเช่นกัน


0

fromCharCode จะคืนค่า 'a' เมื่อกดบน numpad '1' ดังนั้นจึงควรหลีกเลี่ยงเมทิลนี้

(แอดมิน: ไม่สามารถแสดงความคิดเห็นได้ตามปกติ)


0

ฉันเห็นความคิดเห็นมากมายเกี่ยวกับการจัดการการคัดลอก / วาง

หากต้องการปิดคำตอบของ @omeralper คุณสามารถเพิ่มตัวจัดการเหตุการณ์การวางลงในคำสั่ง onlyNumber เพื่อจัดการการคัดลอก / วาง:

 @HostListener('paste', ['$event']) onPaste(event) {
  // Don't allow pasted text that contains non-numerics
  var pastedText = (event.originalEvent || event).clipboardData.getData('text/plain');

  if (pastedText) {
    var regEx = new RegExp('^[0-9]*$');
    if (!regEx.test(pastedText)) {
      event.preventDefault();
    }
}

วิธีนี้จะอนุญาตให้คัดลอกและวางเนื้อหาลงในกล่องข้อความเท่านั้นหากเป็นตัวเลข นั่นเป็นทางออกที่ง่ายที่สุด การเปลี่ยนเนื้อหาของคลิปบอร์ดเพื่อลบสิ่งที่ไม่ใช่ตัวเลขนั้นซับซ้อนกว่ามากและอาจไม่คุ้มค่า

ในการวางข้อความจาก IE คุณสามารถใช้สิ่งต่อไปนี้:

window.clipboardData.getData('Text');



0

คุณยังสามารถสร้างคำสั่งที่ใช้อินเทอร์เฟซ ControlValueAccessor ( https://angular.io/api/forms/ControlValueAccessor )

ดูตัวอย่างการทำงานที่นี่: https://stackblitz.com/edit/angular-input-field-to-accept-only-numbers

คุณสามารถฟังเหตุการณ์ 'อินพุต' และไม่จำเป็นต้องตรวจสอบรหัสคีย์ รองรับการคัดลอกและวางและผสานรวมอย่างดีกับ Angular Forms API เนื่องจากอินเทอร์เฟซ ControlValueAccessor

คำสั่ง:

@Directive({
    ...
    selector: '[onlyNumber]'
})
export class OnlyNumberDirective implements ControlValueAccessor {
private onChange: (val: string) => void;
...
private value: string;

constructor(
    private elementRef: ElementRef,
    private renderer: Renderer2
) {
}

...

@HostListener('input', ['$event.target.value'])
onInputChange(value: string) {
    const filteredValue: string = filterValue(value);
    this.updateTextInput(filteredValue, this.value !== filteredValue);
}

private updateTextInput(value, propagateChange) {
    this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
    if (propagateChange) {
        this.onChange(value);
    }
    this.value = value;
}

// ControlValueAccessor Interface
...

registerOnChange(fn: any): void {
    this.onChange = fn;
}

writeValue(value: string): void {
    value = value ? String(value) : '';
    this.updateTextInput(value, false);
}
}


function filterValue(value): string {
    return value.replace(/[^0-9]*/g, '');
}

การใช้งาน:

<input name="number" type="text" onlyNumber [(ngModel)]="someNumber">
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.