AngularJS自定义验证$setValidity

wfsdck30  于 2023-10-15  发布在  Angular
关注(0)|答案(1)|浏览(126)

考虑这个可运行的示例:http://plnkr.co/edit/1BfO7KkHeMD3EpsULNGP?p=preview

<html ng-app='app'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.4/angular.js"></script>
<script>
angular.module('app', [])
.directive('pwCheck', [function () {
  return {
    require: 'ngModel',
    link: function (scope, elem, attrs, ctrl) {
      var firstPassword = '#' + attrs.pwCheck; 
      elem.add(firstPassword).on('keyup', function () { 
          var v = elem.val()===$(firstPassword).val();
          console.log(v);
          ctrl.$setValidity('pwcheck', v); 
      });
    }
  }
}]);
</script> 
<form name="form">
<input type="text" id="pw1" name="pw1" ng-model="pw1Model">
<input type="text" name="pw2" pw-check="pw1" ng-model="pw2Model">
Valid:  {{form.pw2.$valid}}
<pre>{{form.pw2 |json}}</pre>
</form>

在其中一个字段中写入一个字符,并确保有效性不会更新,直到写入第二个字符。如果您测试复制/粘贴等,则有效性不正确。但是记录了正确的值v。为什么模型没有正确更改?

vybvopom

vybvopom1#

$setValidity Package 到$timeout中

$timeout(function() {
   ctrl.$setValidity('pwcheck', v);
});

http://plnkr.co/edit/OSuHBgtReDoCGWi03Cc8?p=preview
我假设与angular原生input指令的$setValidity调用有一些冲突。将这个调用 Package 到$timeout中可以避免这种冲突。

相关问题