Управление входом в Angular: неверный вход не обнаружен - PullRequest
0 голосов
/ 18 февраля 2020

Я использую Angular 8 для моего клиентского приложения. Я хочу, чтобы сообщение об ошибке отображалось под полем ввода для пользователя, когда он вводит неправильный ввод. Я использую это внутри моего HTML:

  <!-- Score input -->
  <div class="form-group">
    <label for="score">Score</label>
    <input type="number" class="form-control"
           placeholder="0.0 ÷ 10.0"
           min="0.0" max="10.0" step="0.1" name="score"
           id="score"
           [(ngModel)]="model.score"
           #score="ngModel">
    <div [hidden]="score.valid" class="alert alert-danger">
      Insert a value between 0.0 and 10.0
    </div>
  </div>

. Я ожидаю, что он будет отображаться, если пользователь введет, например, «asdf» вместо числа, например «6.7». Но это никогда не появляется. Я попытался удалить [hidden]="score.valid", и он отображается правильно. Почему Angular считает «asdf» допустимым вводом, даже если я установил все эти атрибуты: type="number" min="0.0" max="10.0" step="0.1"?

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Поля ввода номера типа позволяют пользователям вводить символы, которые не являются частью числа. Подробнее см. здесь .

Я не понимаю, как вы справляетесь с установкой значения переменной score.valid. Тем не менее, это может быть достигнуто с помощью CSS псевдо-классов.

input:invalid+span:after {
  content: 'Insert a value between 0.0 and 10.0';
  padding-left: 5px;
}
<!-- Score input -->
<div class="form-group">
  <label for="score">Score</label>
  <input id="input-validator" type="number" class="form-control"
         placeholder="0.0 ÷ 10.0"
         min="0.0" max="10.0" step="0.1" name="score"
         id="score"
         [(ngModel)]="model.score"
         #score="ngModel">
  <span class="alert alert-danger"></span>
</div>

Обновление: Включить кнопку «Отправить».

Шаблон:

<form  #scoreValue="ngForm" (ngSubmit)="submitScore(scoreValue.value)">

  <label>Score: </label>
  <input type="number" class="form-control" (keyup)="onKeyUp($event)" 
    placeholder="0.0 ÷ 10.0"
    [min]="min" [max]="max" [step]="step" name="score"
    id="score"
    [(ngModel)]="score"/>
  <span class="alert alert-danger"></span>
  <br /><br />
  <span> Does not work as expected -> </span>
  <button [disabled]="scoreValue.invalid">Submit</button>
  <br /><br />
  <span> Works as expected -> </span>
  <button [disabled]="disableSubmit">Submit</button>

</form>

Компонент:

public onKeyUp(event){
  let score = event.currentTarget.value;
  if ((score === '') || ((score.split('.')[1] || []).length > 1)) {
    this.disableSubmit = true;
  } else {
    score = Number(score);
    if ((score >= this.min) && (score <= this.max)) {
      this.disableSubmit = false;
    } else {
      this.disableSubmit = true;
    }
  }
}

Рабочий пример: Stackblitz

Атрибуты min и max устанавливают только минимальное и максимальное значения шаговых стрелок. Вот почему scoreValue.invalid не работает должным образом.

0 голосов
/ 18 февраля 2020

Для лучшей проверки вы должны использовать FormControl в файле .ts, также вы можете взглянуть на официальный do c https://angular.io/guide/form-validation.

FormControl более гибкий, чем ngModel - стоит попробовать:)

scoreControl = new FormControl('',
 Validators.compose([
   Validators.required,
   Validators.pattern('^[0-9]*$'),
   Validators.max(10)
 ])
);

и измените свой шаблон следующим образом:

  <div class="form-group">
    <label for="score">Score</label>
    <input type="number" class="form-control"
           placeholder="0.0 ÷ 10.0"
           min="0.0" max="10.0" step="0.1" name="score"
           id="score"
           [formControl]="scoreControl">

    <div *ngIf="score.invalid" class="alert alert-danger">
      Insert a value between 0.0 and 10.0
    </div>

   </div>

В отношении ввода только чисел вы можете проверить здесь: { ссылка }

Наилучший подход - использование директивы

0 голосов
/ 18 февраля 2020

Зачем браузеру разрешать поведение?
Использовать директиву

<input appDecimalOnly />
/**
 * Credit: omeralper stackoverflow user
 * https://stackoverflow.com/questions/41465542/angular2-input-field-to-accept-only-numbers
 */
@Directive({
  selector: "[appDecimalOnly]"
})
export class DecimalOnlyDirective {
  constructor(private el: ElementRef) {}

  @HostListener("keydown", ["$event"]) onKeyDown(event) {
    let e = <KeyboardEvent>event;

    // console.log(e.keyCode)

    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();
    }
  }
}

Stackblitz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...