Проверка формы angular 2, валидатор minLength не работает

У меня следующая форма Angular 2:

<register>
    <form [ngFormModel] = "registrationForm">
        <div class = "form-group">
            <label class = "control-label" for="email">Email</label>
            <input class = "form-control" type="email" id="email" ngControl="email" #email="ngForm">
        </div>
        <div *ngIf = "email.touched && email.errors">
            <div *ngIf = "!email.errors.required && email.errors.underscoreNotFound" class = "alert alert-danger">
                <span>Underscore is required</span> 
            </div>
            <div *ngIf = "email.errors.required" class = "alert alert-danger">
                <span>Email is required</span>
            </div>
        </div>
        <div class = "form-group">
            <label class = "control-label" for="password">Password</label>
            <input class = "form-control" type="password" id="password" ngControl="password" #password="ngForm">
        </div>
        <div *ngIf = "password.touched && password.errors">
            <div *ngIf = "password.errors.minLength && !password.errors.required" class = "alert alert-danger">
                <span>Password should contain 6 characters</span>
            </div>  
            <div *ngIf = "password.errors.required" class = "alert alert-danger">
                <span>Password is required</span>
            </div>          
        </div>
    </form>
</register>

Это мой компонент, в котором я реализовал валидаторы:

import {Component} from '@angular/core';
import {Control, ControlGroup, FormBuilder, Validators} from '@angular/common';
import {CustomValidator} from './CustomValidator';

@Component({
    selector: 'register',
    templateUrl: './app/authentication/register_validation/register.html',
})

export class RegisterComponent{
    registrationForm: ControlGroup;

    constructor(formBuilder:FormBuilder)
    {
        this.registrationForm = formBuilder.group({
            email: ['',Validators.compose([Validators.required, CustomValidator.underscore])], 
            password: ['',Validators.compose([Validators.required,Validators.minLength(6)])]
        });
    }

}

В этой форме поле email отлично работает для обоих валидаторов, т.е. когда я ничего не набираю, оно выдает сообщение "Email is required", когда я начинаю что-то печатать, оно выдает сообщение "Underscore is required", а когда я набираю "_", все сообщения об ошибках исчезают. Однако, когда я пытаюсь применить такие 2 валидатора к полю password, это не работает. Когда я не набираю пароль, появляется сообщение "Password is required". Но когда я набираю что-то менее 6 символов, minLength сообщение вообще не появляется. Что не так в этом коде?


person Nilakshi Naphade    schedule 27.06.2016    source источник
comment
Не могли бы вы создать plnkr.co со своим кодом   -  person Andrei Zhytkevich    schedule 28.06.2016
comment
Также вы используете более раннюю версию, чем RC3. который устарел. Попробуйте новую версию RC3   -  person Hardipsinh Jadeja    schedule 28.06.2016
comment
может ссылаться на этот ответ stackoverflow.com/a/38092249/5868331   -  person mayur    schedule 29.06.2016
comment
@mayur Да. Я нашел обходной путь, добавив собственный класс для minLength, но я хотел использовать оригинальный валидатор. В любом случае спасибо :)   -  person Nilakshi Naphade    schedule 29.06.2016
comment
Оригинальный валидатор означает по умолчанию angular 2 ????   -  person mayur    schedule 29.06.2016
comment
@Mayur Да, Validators.minLength. Однако теперь я столкнулся с аналогичной проблемой для Validators.pattern. В этом случае он показывает мне правильное сообщение, когда шаблон пароля недействителен, но это сообщение об ошибке остается неизменным до конца, даже если я напишу правильный пароль. Как я могу решить эту проблему?   -  person Nilakshi Naphade    schedule 29.06.2016
comment
Может потребоваться дополнительная проверка, возвращаете ли вы значение null, когда условие истинно, чтобы сообщение об ошибке не оставалось на экране   -  person mayur    schedule 30.06.2016
comment
Я столкнулся с аналогичной проблемой. Вы смогли найти какое-нибудь решение?   -  person san    schedule 19.09.2016


Ответы (7)


ключ ошибки - minlength, а не minLength:

<div *ngIf = "password.hasError('minlength') && !password.hasError('required')" class = "alert alert-danger">
  <span>Password should contain 6 characters</span>
</div>  
person cexbrayat    schedule 09.11.2016
comment
Ваша ссылка мертва, но решение все еще работает. Когда вы все еще учитесь, вы можете подумать, что Validators.maxLength будет проверяться идентичным ключом, тем более, что angular не боится верблюжьей оболочки повсюду. Но я предполагаю, что это означает соответствие валидаторам HTML5? В любом случае спасибо. - person Jeremy Pridemore; 09.04.2017
comment
Настоящий вопрос - почему? Я пытаюсь добавить динамические проверки, поэтому теперь я должен вызвать toLowerCase, чтобы перейти от функции к ключу ошибки? Надеюсь, это хотя бы последовательно. - person Greg; 08.02.2018
comment
Три года спустя, и это все еще обычная проблема. Спасибо за помощь! Зачем им использовать строчную L? - person Justin C.; 16.05.2020
comment
То же самое и в Angular 10. Я согласен с тем, что это делается в нижнем регистре, но все же хотел бы знать обоснование. Похоже, в ближайшее время это не будет изменено: github.com/angular/angular/issues/ 7407 - person Harlin; 23.08.2020

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

Образец кода

password1: ['', [Validators.required, Validators.minLength(8)]],

Образец разметки

*ngIf="registrationRequest.get('password1').hasError('minlength')"

Обратите внимание, что в коде это minlength полностью в нижнем регистре.

person Remotec    schedule 20.09.2017
comment
Забыл добавить Validators.required. Вы сэкономили мне много времени. Спасибо :) - person Konrad Linkowski; 08.01.2020
comment
это довольно неприятно. Спасибо! - person Jennifer S; 27.08.2020

Я столкнулся с той же проблемой, но после стольких исследований я нашел решение с этим. Используйте minlength вместо minLength Вот пример.

<div *ngIf = "password.errors.minlength && !password.errors.required" class = "alert alert-danger">
      <span>Password should contain 6 characters</span>
    </div> 

Вместо того

<div *ngIf = "password.errors.minLength && !password.errors.required" class = "alert alert-danger">
  <span>Password should contain 6 characters</span>
</div> 

Надеюсь, это кому-то поможет, спасибо

person Narendra Solanki    schedule 11.07.2019
comment
Пока вы не указали это явно, я искал решение в течение получаса, это следует упомянуть в документации по angular, я не вижу преимущества разработки таких валидаторов форм. - person Pini Cheyni; 02.12.2020

У меня была та же проблема, когда я хотел проверить числовое поле, содержащее год, поэтому я использовал Validators.maxLength(4), чтобы убедиться, что кто-то случайно не наберет 5 чисел за год. Получается, когда вы устанавливаете тип ввода на число:

<input type="number" formControlName='year'>

тогда maxLength больше не работает. Что действительно имеет смысл, если подумать на полсекунды.

Поэтому я изменил ввод даты на:

year: [null, [Validators.required, Validators.min(1990), Validators.max(2050)]],

Это правильный подход при работе с числовым полем.

person Alfa Bravo    schedule 07.09.2020

Это сработало для меня для проверки пароля.

<input type="password" class="form-control" name="password" placeholder="Password" [(ngModel)]="register.password" #password="ngModel" minlength="6" required>
person koti    schedule 14.11.2019

field: ['', Validators.compose([Validators.required, Validators.minLength(8)])]

Это работает только с несколькими валидаторами.

person chris_r    schedule 14.11.2019

<div *ngIf = "password.errors.minLength && !password.errors.required" class = "alert alert-danger">
<span>Password should contain 6 characters</span>
</div> 

minLength должен быть в нижнем регистре minlength

person Діма Ліщинський    schedule 19.01.2021