【问题标题】:How to Validate Multiple Email Addresses in a Reactive Form in Angular 4如何在 Angular 4 中以反应形式验证多个电子邮件地址
【发布时间】:2018-10-10 11:21:44
【问题描述】:

我需要输入 50 个具有相同域名 (gmail.com) 的电子邮件地址。

我使用的是响应式表单。我添加了一些我编写的代码,它对我不起作用。

https://stackblitz.com/edit/angular-wfwfow

谁能帮我解决这个问题?

emailPattern = "[a-zA-Z0-9_.+-,;]+@(?:(?:[a-zA-Z0-9-]+\.,;)?[a-zA-Z]+\.,;)?(gmail)\.com";

 ngOnInit() {
        this.accountingForm = this.fb.group({
            'day' : [null, Validators.required], 
            'email': ['',
                Validators.compose([
                    Validators.required,Validators.pattern(this.emailPattern),this.commaSepEmail
                ])
            ]
        });
    }
    commaSepEmail = (control: AbstractControl): { [key: string]: any } | null => {
        console.log("This is value:" + control.value);
        if (!_.isEmpty(control.value)){
            var emails= control.value.split(',');
            const forbidden = emails.some((email:any) => Validators.email(new FormControl(email)));
        console.log(forbidden);
        return forbidden ? { 'email': { value: control.value.trim() } } : null;
        }
    };
 <form [formGroup]="accountingForm" (ngSubmit)="generateSOR(accountingForm.value)">
    <input formControlName="email" [pattern]="emailPattern" placeholder="Email Address">
    <button type="submit" mat-raised-button class="mat-primary" [disabled]="!accountingForm.valid">Generate</button>
    </form>

【问题讨论】:

  • 您好,您能否详细说明一下它是如何不工作的?你的预期结果是什么,你的实际结果是什么?通过提供更多详细信息,它可以让任何想要提供帮助的人的生活更轻松。
  • 嗨@Hugo Noro,非常感谢您抽出宝贵时间。我有一个生成按钮,如果我添加诸如“example@gmail.com”之类的电子邮件地址,该按钮将被启用,但如果我输入“example@gmail.com,test@gmail.com”,该按钮将被禁用。 ',' 之后没有得到电子邮件地址。
  • 你想用 comasepEmail 功能实现什么?它给你正确的输出吗?
  • 嗨@HugoNoro。请找到我的代码的网址。如果我添加超过 1 个电子邮件地址,则生成按钮会被禁用。 stackblitz.com/edit/angular-wfwfow
  • 您好,感谢您提供代码链接。我建议您编辑您的问题以将链接作为问题的一部分包含在内,以便其他人更容易检查它。请在下面查看我的答案,如果它解决了您的问题,请不要忘记将其标记为已接受。

标签: angular typescript


【解决方案1】:

这将验证逗号分隔的列表之间没有空格。最后一个逗号就可以了。示例:joe@email.co,jiffy@coke.peas。这与joe@email.co,jiffy@coke.peas, 相同。注意最后的逗号没有区别。也没有空间。

 sendEmailForm: FormGroup;

  emailList: string [];

  ngOnInit(): void {
    this.emailList = [];
    const toAddress = new FormControl('', [
      Validators.required,
      Validators.pattern(/^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4},?)+$/)
    ]);

    this.sendEmailForm = new FormGroup({
      toAddress: toAddress
    });
  }
  extractEmailList(e){
    this.emailList = [];
    if(this.sendEmailForm.valid) {     
      let emails = e.split(',');
      emails.forEach(email => {
        if(email && email.length > 0) {
          this.emailList.push(email);
        }
      });
    }
    console.log(this.emailList);
  }

在视图中,您可以添加如下验证。

<form [formGroup]="sendEmailForm" (ngSubmit)="onSubmit($event)">
    <div class="form-group required">
      <span class="label label-primary">Email(s):</span>
      <input
      (ngModelChange)="extractEmailList($event)"
        type="text"
        [formControl]="sendEmailForm.controls['toAddress']"            
        value=""
        maxlength="150"
        name="toAddress"
        class="form-control"
      />
    </div>
    <small
    *ngIf="sendEmailForm.controls['toAddress'].hasError('required') && sendEmailForm.controls['toAddress'].touched"
    class="form-error-msg">
    Valid email is required to send an invitation.
  </small>
    <small
    *ngIf="sendEmailForm.controls['toAddress'].hasError('pattern') && sendEmailForm.controls['toAddress'].touched"
    class="form-error-msg">
    Please enter comma separated list of valid email addresses without spaces in between. No comma is required after last email.
  </small>
      <button type="submit" [disabled]="!sendEmailForm.valid" class="btn btn-primary btn-simple" >Invite</button>
      <small class="form-error-msg">{{emailList.length}} email(s) will be sent.</small>
  </form>

在您的 onSubmit() 方法中,您可以从 emailList 中获取值。无需从表单中获取。

【讨论】:

  • 您将如何更改正则表达式以允许电子邮件之间的空格。例如:email1@gmail.com, email2@yahoo.com
【解决方案2】:

我相信我发现了您在未启用按钮时遇到的问题。如果你改变你的emailPattern

从字符串格式

emailPattern = "[a-zA-Z0-9_.+-,;]+@(?:(?:[a-zA-Z0-9-]+\.,;)?[a-zA-Z]+\.,;)?(gmail)\.com";

转正则格式

emailPattern = /[a-zA-Z0-9_.+-,;]+@(?:(?:[a-zA-Z0-9-]+\.,;)?[a-zA-Z]+\.,;)?(gmail)\.com/;

我相信它会起作用。根据我的测试,您可能希望微调正则表达式以更好地实现预期结果,但这解决了按钮未启用的问题。

我通常更喜欢尽可能使用正则表达式而不是字符串。它也更具可读性。

【讨论】:

  • 没问题。总是乐于提供帮助。
  • 问题虽然已解决,但已占用所有域名。它应该只需要@gmail.com,没有其他域。
  • 正如我在答案中所说,问题可能出在您的正则表达式上。您最初的问题是按钮未启用,因此答案解决了您的问题。正则表达式不匹配是另一个问题。
  • 是的,实际上你是对的。我现在正在使用这个正则表达式。 /^\w+([-+.']\w+)*@gmail.com(, ?\w+([-+.']\w+)*@gmail.com)*$/
  • 那个看起来更干净更简单:)。我很高兴它成功了。
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 2022-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
相关资源
最近更新 更多