【问题标题】:Override AngularJS Default Email Validator覆盖 AngularJS 默认电子邮件验证器
【发布时间】:2015-01-14 20:47:45
【问题描述】:

我想覆盖 AngularJS 的电子邮件验证器。我希望它使用我的自定义字符串来验证电子邮件地址。 我在他们的文档中找到的代码是这样的: JS:

   var app = angular.module('registrationApp', []);

    app.directive('overwriteEmail', function() {
      var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@example\.com$/i;

      return {
        require: 'ngModel',
        restrict: '',
        link: function(scope, elm, attrs, ctrl) {
            if (ctrl && ctrl.$validators.email) {

                // this will overwrite the default Angular email validator
                ctrl.$validators.email = function(modelValue) {
                    return ctrl.$isEmpty(modelValue) || EMAIL_REGEXP.test(modelValue);
                }
            }
        }
    }
});

HTML:

<div data-ng-app="registrationApp" data-ng-init="">
  <form name="form" class="css-form" novalidate>
  <div>
      Overwritten Email:
      <input type="email" ng-model="myEmail" overwrite-email name="overwrittenEmail" />
      <span ng-show="form.overwrittenEmail.$error.email">This email format is invalid!     </span><br>
      Model: {{myEmail}}
    </div>
  </form>
</div>

但是代码不起作用。抛出的错误是:

TypeError:无法读取未定义的属性“电子邮件” 在链接 (http://localhost:63342/goga_tests/js/registration.js:39:32) 在 N (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:54:372) 在 g (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:47:256) 在 g (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:47:273) 在 N (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:54:313) 在 g (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:47:256) 在 N (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:54:313) 在 g (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:47:256) 在http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:46:377http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:18:314

提前感谢您的帮助!

【问题讨论】:

  • 可能你需要在指令中写终端:true,优先级:1001
  • 当我同时添加它们时,它会给出这样的错误:错误:[$compile:ctreq] errors.angularjs.org/1.2.26/$compile/… at Error (native) ... 等

标签: javascript angularjs html angularjs-directive angularjs-validation


【解决方案1】:

您正在使用的角度版本 1.2.26 不会在 ngModel 控制器实例上添加 $validators 特殊属性。您需要 1.3.x 版本的 angular。

如果您有 1.3.x,您可以按原样使用您的指令,并且您可以将优先级 2 添加为大于 ng-model(即 1),以便您的指令在 ng-model 指令之前设置验证器轮到它了:

app.directive('overwriteEmail', function() {
  var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@example\.com$/i;

  return {
    require: 'ngModel',
    restrict: '',
    priority: 2,
    link: function(scope, elm, attrs, ctrl) {
      if (ctrl && ctrl.$validators.email) {
        // this will overwrite the default Angular email validator
        ctrl.$validators.email = function(modelValue) {
          return ctrl.$isEmpty(modelValue) || EMAIL_REGEXP.test(modelValue);
        }
      }
    }
  }
});

演示

var app = angular.module('app', []);

app.directive('overwriteEmail', function() {
  var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@example\.com$/i;

  return {
    require: 'ngModel',
    restrict: '',
    priority: 1,
    link: function(scope, elm, attrs, ctrl) {
      if (ctrl && ctrl.$validators.email) {
        // this will overwrite the default Angular email validator
        ctrl.$validators.email = function(modelValue) {
          return ctrl.$isEmpty(modelValue) || EMAIL_REGEXP.test(modelValue);
        }
      }
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.min.js"></script>
<div ng-app="app">
  <div>
    <form name="form" class="css-form" novalidate>
      <div>
        Overwritten Email:
        <input type="email" ng-model="myEmail" overwrite-email name="overwrittenEmail" />
        <span ng-show="form.overwrittenEmail.$error.email">This email format is invalid!     </span>
        <br>Model: {{myEmail}}
      </div>
    </form>
  </div>
</div>

您也可以坚持使用ng-pattern,如果模式无效,则使用form.overwrittenEmail.$error.pattern 显示消息。

<input type="email" ng-pattern="/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@example\.com$/i" 
                    ng-model="myEmail" name="overwrittenEmail" />
   <span ng-show="form.overwrittenEmail.$error.pattern">

演示

var app = angular.module('app', []);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div>
    <form name="form" class="css-form" novalidate>
      <div>
        Overwritten Email:
        <input type="email" ng-model="myEmail" ng-pattern="/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@example\.com$/i" name="overwrittenEmail" />
        <span ng-show="form.overwrittenEmail.$error.pattern">This email format is invalid!     </span>
        <br>Model: {{myEmail}}
      </div>
    </form>
  </div>
</div>

【讨论】:

  • 哦,谢谢伙计!这解决了问题!我刚刚用较新的版本替换了 angular 并添加了优先级:> 再次感谢!
猜你喜欢
  • 2015-11-06
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多