Валидаторы формы Angular 4 - minLength и maxLength не работают с номером типа поля


person Sangwin Gawande    schedule 09.09.2017    source источник
comment
Числа не имеют длины в отношении проверки формы. Если вам нужны 10-12 цифр, то на самом деле вам нужны числа от 1 000 000 000 до 1 000 000 000 000, верно?   -  person jonrsharpe    schedule 09.09.2017
comment
Да, мне нужны числа от 10000000000 до 999999999999   -  person Sangwin Gawande    schedule 09.09.2017
comment
Тогда используйте это, вместо того, чтобы пытаться проверить длину.   -  person jonrsharpe    schedule 09.09.2017
comment
Значит, для этого нет метода по умолчанию? нам придется создать один, чтобы ограничить их?   -  person Sangwin Gawande    schedule 09.09.2017
comment
Что заставляет вас так говорить? См. angular.io/api/forms/Validators, где показаны как min, так и max.   -  person jonrsharpe    schedule 09.09.2017
comment
Спасибо, Моя ошибка, Просто увидел, написал, и это сработало. :)   -  person Sangwin Gawande    schedule 09.09.2017


Ответы (12)


Обновление 1:

phone: ['',  [Validators.required, Validators.min(10000000000), Validators.max(999999999999)]],

Использовал его, как показано ниже, и работал отлично:

 phone: ['',  [Validators.required, customValidationService.checkLimit(10000000000,999999999999)]],

Пользовательская служба проверки:

import { AbstractControl, ValidatorFn } from '@angular/forms';

export class customValidationService {
   static checkLimit(min: number, max: number): ValidatorFn {
    return (c: AbstractControl): { [key: string]: boolean } | null => {
        if (c.value && (isNaN(c.value) || c.value < min || c.value > max)) {
            return { 'range': true };
        }
        return null;
    };
  }
}
person Sangwin Gawande    schedule 09.09.2017
comment
Я знаю, что опоздал сюда на год, и это не совсем то, о чем спрашивали в OP, но никто не захочет вводить номер телефона как <input type='number'>. Ответ в обновлении 1 верен для целых чисел, но номер телефона не является целым числом. Это даже не та ложь о телефонных номерах, которую я искал для, но у него есть много хороших моментов. - person Coderer; 09.11.2018

попробуйте этот рабочий пример кода:

component.html

<div class="container">
    <form [formGroup]="myForm" 
    (ngFormSubmit)="registerUser(myForm.value)" novalidate>
    <div class="form-group" [ngClass]="{'has-error':!myForm.controls['phone'].valid}">
        <label for="phone">Email</label>
        <input type="phone" formControlName="phone" placeholder="Enter Phone" 
        class="form-control">
        <p class="alert alert-danger" *ngIf="myForm.controls['phone'].hasError('minlength')">
            Your phone must be at least 5 characters long.
        </p>
        <p class="alert alert-danger" *ngIf="myForm.controls['phone'].hasError('maxlength')">
            Your phone cannot exceed 10 characters.
        </p>
        <p class="alert alert-danger" *ngIf="myForm.controls['phone'].hasError('required') && myForm.controls['phone'].dirty">
            phone is required
        </p>
    </div>
    <div class="form-group text-center">
        <button type="submit" class="btn btn-primary" [disabled]="!myForm.valid">Submit</button>
    </div>
</form>
</div>

component.ts

import { FormGroup, FormBuilder, Validators } from '@angular/forms';

export class AppComponent implements OnInit {
myForm: any;
constructor(
        private formBuilder: FormBuilder
    ) {}

ngOnInit() {
    this.myForm = this.formBuilder.group({
            phone: [null, Validators.compose([Validators.required, Validators.minLength(5), Validators.maxLength(10)])]
        });
}
}
person Chandru    schedule 09.09.2017

У меня есть трюк, который работает на 100%.

Определите ввод типа «текст», а не «число».

Например:

<input placeholder="OTP" formControlName="OtpUserInput" type="text">

Затем используйте шаблон, который является частью проверки.

Нравиться :

this.ValidOtpForm = this.formbuilder.group({
             OtpUserInput: new FormControl(
              { value:'', disabled: false },
          [
          Validators.required,
          **Validators.minLength(6),
          Validators.pattern('[0-9]*')**
        ]),
});

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

Оставшийся код:

<mat-error *ngIf="RegistrationForm.controls['Password'].hasError('minlength')">Use 6 or more characters with a mix of letters</mat-error>
<mat-error *ngIf="ValidOtpForm.controls['OtpUserInput'].hasError('pattern')">Please enter numeric value.</mat-error>
person nagender pratap chauhan    schedule 04.01.2019
comment
Отлично сработало идеально для меня. Небольшая деталь: когда мы объявляем minlength в примечании mat-error, это строчная буква, а в валидаторе minLength с прописной. - person Paco Zevallos; 28.07.2019

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

var numberControl = new FormControl("", CustomValidators.number({min: 10000000000, max: 999999999999 }))

Angular2 min/max validators

person Sajeetharan    schedule 09.09.2017

Вместо этого вы можете использовать шаблон для проверки номера телефона и изменить тип ввода на текст.

<input type="text" formControlName="phone" placeholder="Phone Number">

и используйте этот шаблон для номера телефона длиной от 10 до 12

phonePattern = /^[0-9]{10,12}$/;

и измените валидатор в вашем элементе управления формой

phone: ['',  [Validators.required, Validators.pattern(this.phonePattern)]],

и вы можете отобразить ошибку:

<div *ngIf="myForm.get('phone').invalid">
      <div class="error-message invalid-feedback" *ngIf="myForm.get('phone').hasError('required')">
        required!
      </div>
      <div class="error-message invalid-feedback" *ngIf="myForm.get('phone').hasError('pattern')">
        invalid!
      </div>
</div>
person Fateh Mohamed    schedule 17.06.2020

Этот трюк будет полезен

В файле .html

 <input type="text" (keyup)="onKeyUp($event)" formControlName="phone" placeholder="Phone Number">

В файле .ts

Приведенный ниже код ограничивает строковые символы

    public onKeyUp(event: any) {
    const NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/;
    let newValue = event.target.value;
    let regExp = new RegExp(NUMBER_REGEXP);

    if (!regExp.test(newValue)) {
      event.target.value = newValue.slice(0, -1);
    }
   }

и другие подтверждения

phone: ['', Validators.compose([
        Validators.required, 
         Validators.pattern('^[0-9]{0,30}$')])
      ])],

Приведенный выше код шаблона позволяет использовать до 30 цифр. Если вам нужны минимум две цифры, вы можете сделать так

 Validators.pattern('^[0-9]{2,30}$')
person aman raj    schedule 06.04.2020
comment
Зачем использовать дополнительное событие keyup, когда Angular может обойтись без него? - person Sangwin Gawande; 06.04.2020
comment
Я добавил событие keyup, чтобы удалить специальные символы или операторы при вводе, в противном случае вам решать, добавлять событие keyup или нет. - person aman raj; 06.04.2020
comment
Использование type="number" удаляет специальные символы, не так ли? - person Sangwin Gawande; 06.04.2020
comment
Да, он удаляет специальные символы в type= number, но при вводе он будет иметь +, -, e. Если вы хотите ограничить эти операторы при входе, используйте событие keyup, иначе все в порядке. - person aman raj; 06.04.2020

Для поля number вы можете проверить минимальные и максимальные значения, используя встроенную проверку Angular, например:

.ts

import { FormBuilder, FormGroup, Validators } from '@angular/forms';

private myNumberFieldMin: number = 1;
private myNumberFieldMax: number = 1000000;

constructor() {
      this.myForm = this.formBuilder.group({
        myNumberField
      })

this.myForm.controls.myNumberField.setValidators([
  Validators.min(this.myNumberFieldMin),
  Validators.max(this.myNumberFieldMax)
]);

html

<form [formGroup]="myForm">
  <input type="number" formControlName="myNumberField">

  <div *ngIf="this.myForm.controls['myNumberField'].errors && this.myForm.controls['myNumberField'].errors.min">
    <span class="error-message">Value must be at least {{myNumberFieldMin}}</span>
  </div>
  <div *ngIf="this.myForm.controls['myNumberField'].errors && this.myForm.controls['myNumberField'].errors.max">
    <span class="error-message">Maximum value is {{myNumberFieldMax}}</span>
  </div>
</form>
person Chris Halcrow    schedule 26.09.2018

Проверка формы нескольких параметров или нескольких условий должна быть составлена ​​как один валидатор, иначе вы получите наблюдаемую или обещанную ошибку:

phone: ['',  Validators.compose([Validators.required,Validators.min(10000000000), Validators.max(999999999999)])],
person Sampath Kumar    schedule 30.09.2018

Оставьте <input type="number" /> и просто преобразуйте значения int в строки.

const phoneControl: FormControl = this.myForm.controls.phone;

// Do not forget to unsubscribe

phoneControl.valueChanges.subscribe(v => {

  // When erasing the input field, cannot read toString() of null, can occur
  phoneControl.setValue((v && v.toString()) || null, { emitEvent: false });
});
person laurensdewaele    schedule 28.06.2019

Если вы хотите проверить поле несколькими валидаторами, вам следует попробовать это

phone: ['', Validators.compose([
        Validators.required, 
        Validators.minLength(10),
        Validators.maxLength(12)])
      ])],
person Prachi Shah    schedule 08.12.2018

Используйте метод Compose(), объедините несколько валидаторов в одну функцию.

Обновите файл .TS, как показано ниже,

this.myForm = this.formBuilder.group({ phone: ['', Validators.compose([Validators.required, Validators.minLength(10), Validators.maxLength(12)])], message: ['', Validators.compose([Validators.required, Validators.minLength(10), Validators.maxLength(100)])] });

person Jitendra G2    schedule 16.10.2018

person    schedule
comment
Ts File import {Component, OnInit} из '@angular/core'; импортировать { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators} из '@angular/forms'; @Component({ селектор: 'ftl-signup', templateUrl: './signup.component.html', styleUrls: ['./signup.component.scss'] }) экспортный класс PasswordChecker реализует OnInit { validateForm: FormGroup; конструктор (частный fb: FormBuilder) { пароль: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(15)]], }); } - person Tabish Zaman; 23.04.2018
comment
Вы должны отредактировать свой ответ, а не добавлять комментарии к своему собственному ответу. - person kara; 23.04.2018