问题
i want to solve this problem: Angular 5 - template driven form
An input-field has type email. Example:
<input type="email" [(ngModel)]="model.email" #email="ngModel" email />
I want to validate this field. But it should not be a required field. The validation should only start, if it isn't empty. If the field is empty, everthing is fine. Otherwise an error message should be displayed until the e-mail adress is correct.
This is not realy working:
*ngIf="email.untouched && email.invalid"
So, how can i validate the email field? I miss a status like "not empty".
Any hint?
回答1:
You can simply pass additional condition into the ngIf
directive to check if the current value of the input is empty string.
*ngIf="email.value !== '' && email.untouched && email.invalid"
回答2:
Use pattern
attribute with a regular expression for email validation.
<div class="form-group">
<label for ="email">Email</label>
<input type="text" class="form-control" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$" id="email"name="email" ngModel #emailref="ngModel">
<div *ngIf="emailref.errors &&(emailref.touched || emailref.dirty)" class ="aler alert-danger">
<div [hidden]="!emailref.errors?.pattern">
Invalid pattern
</div>
</div>
</div>
回答3:
For Angular 8 versions there is inbuilt email validator available.
In component class variable
email= new FormControl('',[
Validators.required,
Validators.email
]);
In the component html
<input type="email" [formControl]="email" class="form-control" id="email" required>
<div *ngIf="email.invalid && (email.dirty || email.touched)"
class="alert alert-danger">
<div *ngIf="email.errors.required">
Email is required.
</div>
<div *ngIf="email.errors.email">
Please enter a valid email.
</div>
</div>
<div *ngIf="email.errors.email">
Please enter a valid email.
</div> //this is not work
<div *ngIf="email.errors.validateEmail">
Please enter valid email
</div > //use this
回答4:
I am using it in Angular 6+ and it's worked for me.
Use below pattern in TypeScript file.
this.validations_form = this.formBuilder.group({
email: new FormControl('', Validators.compose([
Validators.required,
Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$')
]))
});
回答5:
I tried in angular 7
Below code in html works for me
<input type="email" class="form-control center-ele"
[(ngModel)]="recruiter_mail" id="rmail"
name="recriter_mail"
pattern=".+@globex.com" size="30"
#email="ngModel"
[ngClass]="{ 'is-invalid': f.submitted && email.invalid }"
required email
/>
<div *ngIf="f.submitted && email.invalid" class="invalid-feedback">
<div *ngIf="email.errors.required">Email is required</div>
<div *ngIf="email.errors.email">Email must be a valid email address</div>
</div>
回答6:
Vikas gave a great answer! working instantly in the program, But the console is giving errors if you type/ handle other fields in the form (although still working) so I change #variable emailref to email, like this:
<div class="form-group">
<input type="text" class="form-control" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$"
id="email" name="email" ngModel #email="ngModel" placeholder="Email">
<div *ngIf="email.errors &&(email.touched || email.dirty)" class="aler alert-danger">
<div [hidden]="!email.errors?.pattern">
Invalid pattern
</div>
</div>
</div>
So field attribute name="email"
will be the same as the template variable #email
.
来源:https://stackoverflow.com/questions/49182864/angular-5-form-validation-e-mail