【问题标题】:AngularJS : email or phone number validationAngularJS:电子邮件或电话号码验证
【发布时间】:2016-12-29 19:11:06
【问题描述】:

期望:

我正在 Angular 中处理登录表单。用户可以使用电子邮件/电话登录。我需要在单个文本框中验证电子邮件/电话。

现场场景:

Facebook 在登录中实现了相同类型的功能。我们可以通过电子邮件/电话登录 Facebook。但根据研究,Facebook 通过执行服务器端验证而不是客户端验证来验证用户数据。

到目前为止尝试过:

function validate() {
  var textBoxValue = document.getElementById('emailphone').value;
  var emailPattern = /^[a-z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*)?@[a-z][a-zA-Z-0-9]*\.[a-z]+(\.[a-z]+)?$/; 
  if(textBoxValue == '') {
    alert('Please enter value');
    return false;
  } else if(isNaN(textBoxValue)) {
    if(!(textBoxValue.match(emailPattern))) {
      alert('Please enter valid email');
      return false;
    }
  } else {
    if(textBoxValue.length != 10) {
      alert('Please enter valid phno');
      return false;
    }
  }
}
<input type="text" name="emailphone" id="emailphone"/>
<input type="submit" value="Validate" onclick="validate()">

我可以使用纯 JavaScript 实现此功能,但我想使用 ng-pattern 在 Angular 中实现它,或者如果在 Angular 中有任何解决方法。

我在 SO 上找到了这篇文章,但没有按照我的预期工作

Validation for email or phone number for same text field in angularjs

【问题讨论】:

  • codepen.io/rpdasilva/pen/DpbFf 我最喜欢的电话指令。不完全适用于您的情况,但可能有助于查看。
  • 您在其他问题的答案中发现“没有按照 [您的] 期望工作”是什么?因为这非常接近这个问题的完全重复。
  • @MikeMcCaughan 验证未按我的预期工作。当我尝试输入字母时,它会显示一条错误的错误消息,提示我尝试输入电子邮件时电话号码无效。
  • 如果您想对击键进行验证,它不会知道您输入的是电子邮件还是电话号码。如果您希望在他们离开该字段时进行验证,请添加 ng-model-options="{ 'updateOn': 'blur' }"

标签: angularjs validation ng-pattern


【解决方案1】:

您可以使用角度表单验证和 ng-pattern 指令进行输入 使用ng-pattern="/^(?:\d{10}|\w+@\w+\.\w{2,3})$/"

Working Demo

var app = angular.module("MY_APP", []);
app.controller("MyCtrl", function($scope) {
  $scope.submitted = false;
  $scope.submit = function(userData){
  	console.log(userData)
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="MY_APP">
  <div ng-controller="MyCtrl">
  <form name="userForm" novalidate ng-submit="userForm.$valid && submit(userData)">
              <div class="errorMsg" ng-show="submitted==true && userForm.$invalid">
                    <ul>
                        <li ng-show="submitted==true && userForm.emailphone.$error" class="errorMsg">
                            wrong format, It should be email or 10 digit mobile number
                        </li>
                    </ul>
                </div>
    <input type="text" name="emailphone" ng-model="userData.user" id="emailphone"  required
    ng-pattern="/^(?:\d{10}|\w+@\w+\.\w{2,3})$/" />
    <button type="submit" ng-click="submitted = true">Submit</button>
</form>
</div>
</div>

【讨论】:

    【解决方案2】:

    这样做,我们可以使用NgFormControllersvalidators 在angularjs 中验证表单。下面的代码可帮助您在输入时和提交表单之前输入正确的电子邮件或电话。 ng-if="form.emailphone.$error.pattern" 在此,form 是表单的名称,emailphone 是输入字段的名称,$error 是验证失败的持有者。在输入与ng-pattern 中的表达式匹配之前,$error.pattern 将为真

    <form name="form">
         <input type="text" name="emailphone" ng-model="email" ng-pattern="/^([a-z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*)?@[a-z][a-zA-Z-0-9]*\.[a-z]+(\.[a-z]+)?)|[7-9][0-9]{9}$/" >
         <span ng-if="form.emailphone.$error.pattern">Enter correct email or phone number!</span>
    </form>
    

    ng-model 是必填项。否则它将无法正常工作。因为在pattern 匹配之前它是undefined。 如您所知,在提交表单之前验证表单以获得更好的用户体验

    【讨论】:

    • 请再次阅读我的问题。我需要在单个文本框中验证电子邮件/电话,而不仅仅是电子邮件。
    • 只需为两者编写正确的模式。就是这样。我在回答中也提到了
    • 您能否提供小提琴链接。在您的回答中,我只能通过电子邮件发送验证消息。它将如何与电话一起使用。
    • 现在我的问题是我将如何显示具有相同 ng-pattern 的移动设备和电子邮件的单独错误消息?
    • 我不知道您为什么要为单个输入显示两条消息。只需尝试显示enter correct email or phone number。或者你可以有一个同时引用的名字,username
    【解决方案3】:

    您可以在 ng-pattern 指令中使用角度形式验证器。

    <form name="userForm">
        <input type="text" name="emailphone" ng-model="userData.user" id="emailphone" ng-pattern="/(^[0-9]{10,10}$)|(^[a-z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*)?@[a-z][a-zA-Z-0-9]*\.[a-z]+(\.[a-z]+))?$/" />
        <button type="submit" ng-disabled="userForm.$invalid" ng-click="validate()">Submit</button>
    </form>
    

    一旦您为表单命名,您就可以使用其中的验证器。 userForm.$invalid 将在它检测到表单内的无效输入的情况下为真。然后,使用指令ng-disabled 您可以禁用该按钮。

    由于我们添加了ng-pattetrn,除非输入匹配 ng-pattern 正则表达式,否则它将为 true。

    另外需要知道的是,ng-model 的值:userData.user 除非与正则表达式匹配,否则将是未定义的

    【讨论】:

    • 我需要在单个文本框中验证电子邮件/电话,而不仅仅是电子邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2015-12-22
    • 2015-09-08
    • 1970-01-01
    • 2014-04-25
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多