59
задан 17 September 2019 в 22:39

8 ответов

Вы могли также создать директиву, которая реализует Интерфейс ControlValueAccessor ( https://angular.io/api/forms/ControlValueAccessor).

Посмотрите рабочий пример здесь: https://stackblitz.com/edit/angular-input-field-to-accept-only-numbers

можно слушать 'входное' событие и нет никакой потребности проверить на коды клавиши. Это поддерживает копию & вставьте и интегрирует приятно с Угловыми Формами 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">
0
ответ дан 1 November 2019 в 11:02
 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();
          }
        };

      }
    }

Директива является также лучшим способом сделать это

0
ответ дан 1 November 2019 в 11:02

Не было бы достаточно просто только записать

onlyNumbers(event) {
if(isNaN(event.target.value * 1)) {
 console.log("Not a number")
} else {
  console.log("Number")
}

}

0
ответ дан 1 November 2019 в 11:02

Если Вы используете воспламенение и Угловые 6 или выше существует p-inputMask компонент. Это предотвращает альфа-ввод И отрицательные величины https://www.primefaces.org/primeng/#/inputmask

0
ответ дан 1 November 2019 в 11:02

Просто используйте число типа на своем тексте как ниже:

<input type="number" class="form-control" matInput name="value" placeholder="xxx" (change)="xxx()" formControlName="value">
0
ответ дан 1 November 2019 в 11:02

Ниже мой угловой код, который позволяет единственному числу входить и только вставлять число, не текст.

<input id="pId" maxlength="8" minlength="8" type="text" [(ngModel)]="no" formControlName="prefmeno" name="no" class="form-control">

И в ts файле, добавленном в ngOnIt.

ngOnInit() {
  setTimeout(() => {
  jQuery('#pId').on('paste keyup', function(e){
    jQuery(this).val(document.getElementById('pId').value.replace(/[^\d]/g, ''));
  });
}, 2000);
}

я использовал setTimeout в течение времени ожидания для загрузки DOM. И используемый jQuery с JavaScript для выполнения этой задачи. 'Вставка' и 'keyup' используются, чтобы инициировать вставку и войти в поле.

0
ответ дан 1 November 2019 в 11:02

Вы могли использовать regex:

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

numericOnly(event): boolean {    
    let patt = /^([0-9])$/;
    let result = patt.test(event.key);
    return result;
}
5
ответ дан 1 November 2019 в 11:02

Хорошо Благодаря 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]* 

HTML

<input type="text" class="text-area" [(ngModel)]="itemName" maxlength="3" appNumberOnly />
); 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
ответ дан 1 November 2019 в 11:02

Другие вопросы по тегам:

Похожие вопросы: