AngularJS自定义验证$setValidity

AngularJS自定义验证$setValidity,angularjs,Angularjs,考虑这个可运行的示例: 角度.module('app',[]) .directive('pwCheck',[函数(){ 返回{ 要求:'ngModel', 链接:函数(范围、元素、属性、ctrl){ var firstPassword='#'+attrs.pwCheck; 元素add(firstPassword).on('keyup',函数(){ var v=elem.val()==$(firstPassword.val(); 控制台日志(v); ctrl.$setValidity('pwch

考虑这个可运行的示例:


角度.module('app',[])
.directive('pwCheck',[函数(){
返回{
要求:'ngModel',
链接:函数(范围、元素、属性、ctrl){
var firstPassword='#'+attrs.pwCheck;
元素add(firstPassword).on('keyup',函数(){
var v=elem.val()==$(firstPassword.val();
控制台日志(v);
ctrl.$setValidity('pwcheck',v);
});
}
}
}]);
有效:{form.pw2.$Valid}
$timeout(function() {
   ctrl.$setValidity('pwcheck', v);
});
{{form.pw2 | json}

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

$setValidity
包装为$timeout

我假设angular native
input
指令的
$setValidity
调用存在一些冲突。
将此调用包装到
$timeout
中可以避免此冲突。

与nextTick()类似吗?是的。更确切地说,$setValidity调用将排队。
$timeout(function() {
   ctrl.$setValidity('pwcheck', v);
});