当多个验证消息满足条件时,在Angular2中管理验证消息

时间:2018-04-06 10:31:24

标签: angular validation angular2-forms angular2-form-validation

我正在使用 FormGroup FormBuilder Validators 类来验证Angular2应用中的表单。

这就是我为电子邮件和密码验证定义所需验证规则的方法: -

export class LoginComponent implements OnInit {
    loginFormGroup:FormGroup;
    adminLoginmodel = new Admin('', '', '', 'Emailsss','Passwordsss');  

    constructor(
       private route: ActivatedRoute,
       private router: Router,
       private _adminLogin: AdminLoginService,
       fb: FormBuilder
    ){
         this.loginFormGroup = fb.group({
            'email' : [null, Validators.compose([Validators.required, Validators.email])],
            'password': [null, Validators.required]
         });
    }
}

这是我的html脚本: -

<form class="form-horizontal" role="form" [formGroup]="loginFormGroup" (ngSubmit)="submitPost(loginFormGroup.value)" method="post">
<fieldset>
    <div class="input-group input-group-lg" [ngClass]="{'has-error':!loginFormGroup.controls['email'].valid && loginFormGroup.controls['email'].touched}">
        <span class="input-group-addon"><i class="glyphicon glyphicon-user red"></i></span>
        <input type="text" class="form-control" placeholder="Email" id="email" name="email" [formControl]="loginFormGroup.controls['email']" [(ngModel)]="adminLoginmodel.email"/>
    </div>
    <div class="alert alert-danger" *ngIf="loginFormGroup.controls['email'].hasError('email')">Provide a valid email.</div>
    <div class="alert alert-danger" *ngIf="loginFormGroup.controls['email'].hasError('required')">You must add an email.</div>

    <div class="clearfix"></div><br>
    <div class="input-group input-group-lg" [ngClass]="{'has-error':!loginFormGroup.controls['password'].valid && loginFormGroup.controls['password'].touched}">
        <span class="input-group-addon"><i class="glyphicon glyphicon-lock red"></i></span>
        <input type="password" class="form-control" placeholder="Password" id="password" name="password" [formControl]="loginFormGroup.controls['password']" [(ngModel)]="adminLoginmodel.password"/>
    </div>
    <div class="alert alert-danger" *ngIf="!loginFormGroup.controls['password'].valid">You must add a password.</div>
    <div class="clearfix"></div>
    <p class="center col-md-5">
        <button type="submit" class="btn btn-primary" [disabled]="!loginFormGroup.valid">Login</button>
    </p>
    <div class="clearfix"></div>
</fieldset>
</form>

问题1: 当单个输入字段显示两条验证消息时,如何仅显示一条验证消息?

检查下面给出的图像: -

Two message

如果email字段中没有数据,则验证规则都令人满意: -

  1. 该字段没有数据,因此需要数据。
  2. 空数据不是有效的电子邮件,因此需要有效的电子邮件。
  3. 我需要只显示一条验证消息,而不是两条验证消息。如果没有给出电子邮件,则应显示&#34;您必须添加电子邮件&#34;。当给出电子邮件并且它不是有效的电子邮件时,只有它会显示&#34;请提供有效的电子邮件&#34;我怎样才能做到这一点?

    问题2: 仅当用户与表单交互时如何显示验证消息?

    目前,即使页面第一次加载,验证消息也会加载。即使用户未在字段中输入任何值或单击按钮,仍会显示验证消息。验证消息应仅在用户对表单执行任何操作时显示。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

第一个问题

<div class="alert alert-danger" *ngIf="loginFormGroup.controls['email'].hasError('email') && !loginFormGroup.controls['email'].hasError('required')">Provide a valid email.</div>
<div class="alert alert-danger" *ngIf="loginFormGroup.controls['email'].hasError('required')">You must add an email.</div>

第二个问题:Control Status Classes

  

Angular会自动将许多控件属性镜像到窗体控件元素上作为CSS类。

  • .ng-valid
  • .ng-invalid
  • .ng-pending
  • .ng-pristine
  • .ng脏
  • .ng-untouched
  • .ng触摸

所以在您的情况下,您需要检查您的控件是否脏,然后再检查它是否无效。

<ng-container *ngIf="loginFormGroup.controls['email'].dirty">
  <div class="alert alert-danger" *ngIf="loginFormGroup.controls['email'].hasError('email')">Provide a valid email.</div>
  <div class="alert alert-danger" *ngIf="loginFormGroup.controls['email'].hasError('required')">You must add an email.</div>
</ng-container>