为什么添加额外的AngularJS验证指令会导致$asyncValidators多次运行?

为什么添加额外的AngularJS验证指令会导致$asyncValidators在页面加载时多次运行?

我创建了一个实现$asyncValidators的自定义指令.这是该自定义指令的基本结构:

myApp.directive('userSaved',['$q','userLookup',function($q,userLookup){
return {
  restrict: 'A',require: 'ngModel',link: function(scope,elem,attrs,ctrl){
    ctrl.$asyncValidators.userSaved = function(modelValue,viewValue) {
      // do stuff 
    }
  }
}
}]);

控制器初始化tailNumber模型值,如下所示:

$scope.tailNumber = 'N33221';

这是用户保存的指令在页面加载时运行3次的html:

<input ng-model="tailNumber" name="tailNumber"   user-saved 
    ng-minlength="2"   ng-pattern="/^[A-z][a-zA-Z0-9]*$/" >

当我删除ng-minlength =“2”时,用户保存的指令在页面加载时运行两次(2次).这是移除了ng-minlength =“2”的html:

<input ng-model="tailNumber" name="tailNumber"   user-saved 
    ng-pattern="/^[A-z][a-zA-Z0-9]*$/" >

当我删除ng-pattern =“/ ^ [A-z] [a-zA-Z0-9] * $/”时,用户保存的指令只运行一次.这是移除ng-pattern =“/ ^ [A-z] [a-zA-Z0-9] * $/”后的html

<input ng-model="tailNumber" name="tailNumber" user-saved >

为什么我的函数注册了$asyncValidators为附加到表单元素的每个额外的ng验证器运行额外的时间?

我的自定义指令是一个昂贵的$http调用,我更喜欢我的自定义指令只在页面加载时运行一次.是否可以使用所有这些ng验证器,而只运行我的异步验证器功能一次而不是页面加载3次?

这是因为像ngMaxlength,ngPattern这样的验证指令通过调用ngModelController来调用初始验证周期.$validate().

这会导致所有验证指令运行其验证逻辑,包括异步验证器.

一种防止冗余$http调用方法,实际上无论如何都是一种好的做法,就是缓存每个输入的验证结果.

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...