验证电子邮件唯一性时AngularJS /奇怪的行为

时间:2013-10-11 10:06:30

标签: javascript validation angularjs

我有一个由Angular控制的表单,我希望这会发现潜在的重复用户的电子邮件。

我关注的代码是:http://plnkr.co/edit/XQeFHJTsgZONbsrxnvcI

它包含两个指令:

  • ngFocus:能够获得有关输入是焦点还是模糊的信息。           它还会关注hasVisited变量,以避免验证blur上的输入(如果用户至少未达到一次)。
  • emailUnique:执行与现有邮件(硬编码)的简单比较,以便能够验证email输入。

重点是:(不要忘记放置"标签"触摸以执行blur功能以查看字段的验证错误)

  • 如果我没有输入任何内容并转到名称输入(模糊电子邮件输入),则会显示:该字段是必需的。这很好。
  • 如果我输入一个无效的电子邮件,例如字符串" ferfergre",则会显示:此电子邮件无效。。这很好。
  • 如果那时我输入的有效电子邮件与现有的硬编码电子邮件不同:(michael@gmail.com),则不会显示错误。这很好。
  • 如果我输入现有邮件:michael@gmail.com,则会显示:此电子邮件已存在。。这是好事,因为它警告它。
  • 但是,如果在DOM循环期间至少有一次,则判断电子邮件为#34;此电子邮件已存在",即使我将其更改为新的有效电子邮件,此错误仍然存​​在...

问题:如何处理最后一个案例?

我有两个假设:

  • HTML属性的顺序很重要:autofocus email-unique ng-focus required
  • setValidity指令代码中的
  • emailUnique方法可以避免ctrl再次成为$valid,然后阻止再次执行邮件比较。

1 个答案:

答案 0 :(得分:2)

只需从解析器功能中删除此代码段:

if(!ctrl.$valid){
    return viewValue;
}

此代码阻止再次执行邮件比较。

使用此片段,其下方的代码(进行比较)仅在控件有效时才会运行,但如果控件无效则永远不会运行。

更新了plunker:http://plnkr.co/edit/6q3cANiFI4vpWcVEHRvo?p=preview


编辑(更好的选择):

如果您不想在电子邮件字段对其他规则(“required”和“email”)无效时执行比较,那么您还需要检查{ {1}}。不要删除上面提到的代码段,只需将其更改为:

ctrl.$error

这样,只有在控件无效但由于其他规则(而不是emailUnique)规则时才会返回。

更新了plunker:http://plnkr.co/edit/IDQitVkeHHDyJlcsatMy?p=preview