Angular сбрасывает event.target.value, если ввод в числовом типе не является числом

Я борюсь за третий день с этим вопросом. Я использую угловые динамические формы с formControl для привязки значений и проверки созданных элементов управления к форме. Также в комплекте: материал угловой.

У меня есть такая проблема: когда я набираю input в input type=number, то есть " 123." оно сбрасывает значение в пустую строку. После добавления еще одной цифры "123,3" значение устанавливается на 123,30, что является правильным.

Проблема заключается в том, что каждый раз, когда пользователь устанавливает значение, заканчивающееся точкой или запятой в конце, или имеет более 1 запятую / точку, или в принципе неправильно. Проверка Angular не запускается - поле становится пустым, значение равно '', и поэтому без какого-либо сообщения элемент управления пуст и форма действительна, даже если пользователь ввел некоторые данные. Я понял, что не позволю пользователю вводить второй период / запятую, но я не могу предотвратить это, потому что не могу проверить, поставил ли он уже запятую в случае '123.' так как значение получает ''. Это так запутанно.

Если я изменю на type=text, все работает нормально.

Из того, что я исследовал - это как-то связано с Access Value Number.

writeValue(value: number): void {
    // The value needs to be normalized for IE9, otherwise it is set to 'null' when null
    const normalizedValue = value == null ? '' : value;
    this._renderer.setProperty(this._elementRef.nativeElement, 'value', normalizedValue);
}

registerOnChange(fn: (_: number|null) => void): void {
    this.onChange = (value) => { fn(value == '' ? null : parseFloat(value)); };
}

Я попытался перезаписать его с помощью customValueAccessor, но безуспешно. Я также пытался использовать текст типа inpt, но мне нужно, чтобы на мобильных телефонах появлялась цифровая клавиатура, и я не могу заставить ее работать даже с pattern=\d*, потому что тогда сложная угловая проверка сводит с ума.

это немного моего кода:

import { FieldConfig } from '../../interfaces/field-config.interface';
import { Field } from '../../interfaces/field.interface';
import { LabelFieldConfig } from '../../interfaces/label-field-config.interface';
import { TextFieldConfig } from '../../interfaces/text-field-config.interface';

@Component({
  selector: 'form-input',
  templateUrl: './form-input.component.html',
  styleUrls: ['form-input.component.scss']
})
export class FormInputComponent implements Field, OnInit {
  config: FieldConfig & LabelFieldConfig & TextFieldConfig;
  group: FormGroup;
  formControl: AbstractControl;

  onBlur(): void {
    let value = this.formControl.value;
    value = this.config.format(value);
    if (this.formControl.valid) {
      this.formControl.setValue(value);
    }
  }

  keyDown(event: any): void {
    const { keyCode } = event;

    if (!this.config.isValidKeyCode(keyCode)) {
      event.preventDefault();
    }
  }

  ngOnInit() {
    this.formControl = this.group.controls[this.config.name];
  }
}

Есть идеи? Ваша помощь будет высоко ценится. Или, может быть, вы знаете, как заставить цифровую клавиатуру вводить текст? Это было бы также полезно.

Если вам понадобится дополнительная информация, я с удовольствием предоставлю ее. Спасибо

0 ответов

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