Form Validation - Email Validation not working as expected in AngularJs

后端 未结 6 682
北荒
北荒 2020-12-25 12:35

I am using Angular for form validation.

Here is what I use - plunker-edit I have taken this code from Angularjs documentation - Binding to form and control state Hav

相关标签:
6条回答
  • 2020-12-25 13:07

    As ReCaptcha suggested I ended up creating a custom validation directive

    var app = angular.module('login-form', []);
    var INTEGER_REGEXP = new RegExp('^[a-z0-9]+(\.[_a-z0-9]+)*@@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,50})$', 'i');
    app.directive('cemail', function () {
        return {
            require: 'ngModel',
            link: function (scope, elm, attrs, ctrl) {
                ctrl.$parsers.unshift(function (viewValue) {
                    if (INTEGER_REGEXP.test(viewValue)) {
                        // it is valid
                        ctrl.$setValidity('cemail', true);
                        return viewValue;
                    } else {
                        // it is invalid, return undefined (no model update)
                        ctrl.$setValidity('cemail', false);
                        return undefined;
                    }
                });
            }
        };
    });
    

    and in html

    <label>Email</label>
    <input id="UserName" name="UserName" type="text" value="" data-ng-model="email" required="" cemail>
    <span data-ng-show="form.UserName.$dirty && form.UserName.$invalid">
        <span data-ng-show="form.UserName.$error.required">Required</span>
        <span data-ng-show="form.UserName.$error.cemail">Invalid Email</span>
    </span>
    
    0 讨论(0)
  • 2020-12-25 13:12

    These emails are valid, as they can be local emails or to an intranet email server: Domains.

    The TLD is not required for local emails. As shown in the Wikipedia example, the domain may even contain an IP Address in place of the domain.

    0 讨论(0)
  • 2020-12-25 13:12

    I have written a directive that uses the same email validation regular expression that ASP.Net uses. While this may not cover 100% of scenarios, it will cover the vast majority and works perfectly for what we need to cover.

    function email() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            if (!ctrl) {
                return false;
            }
    
            function isValidEmail(value) {
                if (!value) {
                    return false;
                }
                // Email Regex used by ASP.Net MVC
                var regex = /^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/i;
                return regex.exec(value) != null;
            }
    
            scope.$watch(ctrl, function () {
                ctrl.$validate();
            });
    
            ctrl.$validators.email = function (modelValue, viewValue) {
                return isValidEmail(viewValue);
            };
        }
    };
    }    
    

    Use it like this:

    <input type="email" ng-model="$scope.emailAddress" name="newEmailAddress" email/>
    
    0 讨论(0)
  • 2020-12-25 13:22

    Refer to my another answer: AngularJS v1.3.x Email Validation Issue

    Try to use ng-pattern in your email input.

    <input type="email" name="input" ng-model="text" ng-pattern="/^[_a-z0-9]+(\.[_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/" required>
    

    It fits your valid and invalid cases.

    See an example: plunk

    0 讨论(0)
  • 2020-12-25 13:25

    Angular 6

    I generally don't want to allow $$$@$$$ format and always expect a TLD (like .com, .net, .org, etc).

    In addition to angular email validator I add my regex pattern to make it work.

     <input type="email" name="email" pattern="^\S*[@]\S*[.]\S*$" email required />
    

    pattern="^\S*[@]\S*[.]\S*$" will make sure that there is a @ and a . followed by a string. This will be an addition to Angular's email validation.

    0 讨论(0)
  • 2020-12-25 13:31

    Even better, now, Angular has email validator built-in, from Angular 4 onwards https://github.com/angular/angular/blob/master/CHANGELOG.md#features-6 https://github.com/angular/angular/pull/13709

    Just add email to the tag. For example

      <form #f="ngForm">
        <input type="email" ngModel name="email" required email>
        <button [disabled]="!f.valid">Submit</button>
        <p>Form State: {{f.valid?'VALID':'INVALID'}}</p>
      </form>
    
    0 讨论(0)
提交回复
热议问题