Angular 5 - 表单验证电子邮件

时间:2018-03-08 21:35:20

标签: angular angular4-forms

我想解决这个问题: Angular 5 - 模板驱动形式

输入字段包含电子邮件类型。例如:

<input type="email" [(ngModel)]="model.email" #email="ngModel" email />

我想验证此字段。但它不应该是必填字段。 验证应该只在没有空的情况下开始。 如果该字段为空,则可以使用。否则,在电子邮件地址正确之前,应显示错误消息。

这不是真正的工作:

*ngIf="email.untouched && email.invalid"

那么,我该如何验证电子邮件字段? 我想念的状态是&#34;不是空的&#34;。

任何提示?

11 个答案:

答案 0 :(得分:21)

pattern属性与正则表达式一起用于电子邮件验证。

 <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>

答案 1 :(得分:3)

您可以简单地将附加条件传递到ngIf指令中,以检查输入的当前值是否为空字符串。

*ngIf="email.value !== '' && email.untouched && email.invalid"

答案 2 :(得分:1)

在Angular 8中:

<div class="form-group">
        <label for="email">Email</label>
        <input type="email" required id="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$"
         ngModel #emailref="ngModel" class="form-control" [class.success]="!emailref.invalid">
         <div *ngIf="emailref.errors &&(emailref.touched || emailref.dirty)" class ="text-error">
              Invalid email
           </div>
       </div>

在您的css文件中添加这两个简单的类

`.success{
border: 1px solid greenyellow;
}
.text-error{
    color: red;
}`

答案 3 :(得分:0)

我正在Angular 6+中使用它,并且对我有用。

在TypeScript文件中使用以下模式。

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-.]+$')
    ]))
});

答案 4 :(得分:0)

我尝试了7号角

下面的html代码对我有用

<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>

答案 5 :(得分:0)

维卡斯给出了一个很好的答案!在程序中立即工作, 但是,如果您键入/处理表单中的其他字段(尽管仍在工作),则控制台会出现错误,因此我将#variable emailref更改为email,如下所示:

<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>

因此字段属性name="email"与模板变量#email相同。

答案 6 :(得分:0)

对于Angular 8个版本,有内置的电子邮件验证器。

在组件类变量中

email= new FormControl('',[
    Validators.required,
    Validators.email
  ]);

在组件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> 

答案 7 :(得分:0)

在xyz.component.html文件中的以下实现。该代码将牢记有效的电子邮件和必需的电子邮件验证。

<mat-form-field>
         <input matInput #email="ngModel" type="email" [(ngModel)]="data.email" name="data_email" placeholder="Email" [class.is-invalid]="email.invalid && email.touched" required
                pattern="^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$">
         <mat-error *ngIf="email.errors && (email.invalid || email.touched) && email.errors.pattern">Please enter a valid email address.</mat-error>
         <mat-error *ngIf="email.errors && (email.invalid || email.touched) && email.errors.required">Email is required.</mat-error>
</mat-form-field>

答案 8 :(得分:0)

我认为 angular(6+) 的更好答案是 Ajay Gupta 的答案。因为 Validators.email 喜欢 Krishnadas 的回答,所以让我们传递 email@email 之类的东西。但我搜索了更好的模式,并在 this 答案中找到了一个更好的模式,并进行了解释。

如果您使用 prettier 或格式化您的代码的东西(并且总是更好),您的正则表达式模式最好在 / / 个字符之间 所以:

this.form = this.formBuilder.group({
email: ['', [
       Validators.required,
       Validators.pattern(/^[\w]{1,}[\w.+-]{0,}@[\w-]{1,}([.][a-zA-Z]{2,}|[.][\w-]{2,}[.][a-zA-Z]{2,})$/)
       ]]
});

您可以捕获如下错误:

<div *ngIf="(email.invalid && email.touched) || email.dirty">
    <small *ngIf="email.errors?.required" class="text-danger">email is required</small>
    <small *ngIf="email.errors?.pattern" class="text-danger">Please provide a valid email address</small>
</div>

您可以制作自己的扩展 Validators 的验证器,以制作您自己的电子邮件验证器:

export class CommonValidators extends Validators {
  static email(control: FormControl): ValidationErrors | null {
    const value: string = control.value;
    if (_.isEmpty(value)) {
      return null;
    }

    const pattern = /^[\w]{1,}[\w.+-]{0,}@[\w-]{1,}([.][a-zA-Z]{2,}|[.][\w-]{2,}[.][a-zA-Z]{2,})$/;

    if (!value.match(pattern)) {
      return { email: true };
    }

    return null;
  }
}

答案 9 :(得分:0)

我有一个场景,我想在输入的电子邮件生效后立即启用一个按钮并在 Angular 7 中更改其颜色:

import { fromEvent } from 'rxjs';
  
@ViewChild("emailInput") private emailInputRef: ElementRef;
isValidEmail = false; 
  
ngAfterViewInit(): void {
  fromEvent(this.emailInputRef.nativeElement, 'keyup')
  .subscribe(() => {
      var re = new RegExp("[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$");
      this.isValidEmail = re.test(this.emailInputRef.nativeElement.value);
  }); 
}
<mat-form-field style="width: 100%"> 
 <input #emailInput matInput placeholder="Email address*" type="email" autocomplete="offhack" style="width: 100%">
</mat-form-field>
<button [color]="isValidEmail ? 'accent' : ''" [disabled]="!isValidEmail" style="width: 100%" mat-flat-button>Send Verification Email</button>
        

答案 10 :(得分:0)

如果你想使用 Angular 内置的电子邮件验证器,即使它可能没有最好的 RegEx(像 abc@abc 这样的东西会通过验证,但这是前端,所以也许你不想招致太多脑损伤“解决”这个),你需要在你的 HTML 模板中添加 from os.path import isfile from sqlite3 import connect from apscheduler.triggers.cron import CronTrigger DB_PATH = "./data/db/database.db" BUILD_PATH = "./data/db/build.sql" cxn = connect(DB_PATH, check_same_thread=False) cur = cxn.cursor() def with_commit(func): def inner(*args, **kwargs): func(*args, **kwargs) commit() return inner @with_commit def build(): if isfile(BUILD_PATH): scriptexec(BUILD_PATH) def commit(): cxn.commit() def autosave(sched): sched.add_job(commit, CronTrigger(second=0)) def close(): cxn.close() def field(command, *values): cur.execute(command, tuple(values)) if (fetch := cur.fetchone()) is not None: return fetch[0] def record(command, *values): cur.execute(command, tuple(values)) return cur.fetchone() def records(command, *values): cur.execute(command, tuple(values)) return cur.fetchall() def column(command, *values): cur.execute(command, tuple(values)) return [item[0] for item in cur.fetchall()] def execute(command, *values): cur.execute(command, tuple(values)) def multiexec(command, valueset): cur.executemany(command, valueset) def scriptexec(path): with open(path, "r", encoding="utf-8") as script: cur.executescript(script.read()) (在你的 component.ts 中没有),像这样:

[email]="true"

然后,您可以使用 *ngIf="email.errors?.email" 来检查其有效性。根据 Angular 文档,您可以简单地编写 <input type="email" name="email" #email="ngModel" [email]="true" [(ngModel)]="email_var"> 甚至只是 email="true",但 email 使它看起来正式并且不太可能被遗漏!