Javascript 指令在字段上调用setValidity(false),但字段有效性不会根据视图而改变
关于本文件: 我有一个指令,它运行一个测试,然后调用Javascript 指令在字段上调用setValidity(false),但字段有效性不会根据视图而改变,javascript,angularjs,validation,Javascript,Angularjs,Validation,关于本文件: 我有一个指令,它运行一个测试,然后调用$scope.form['myfield'].setValidity(),并给出结果。但是,这不会反映在视图或控制器中 始终将设置为false的简单示例: app.directive('myDirective', function() { return { link: function(scope, elem, attrs) { elem.on('blur change', function() { co
$scope.form['myfield'].setValidity()
,并给出结果。但是,这不会反映在视图或控制器中
始终将设置为false
的简单示例:
app.directive('myDirective', function() {
return {
link: function(scope, elem, attrs) {
elem.on('blur change', function() {
console.log("start valid:" + scope.form[attrs.name].$valid);
scope.form[attrs.name].$setValidity('myfield', false);
console.log("end valid:" + scope.form[attrs.name].$valid);
});
}
};
});
我认为:
<input type="text" ng-model="myModel" name="myfield" my-directive/>
控制台日志记录确认当指令中的事件首次激发时,字段有效,然后在setValidity之后变为false。在随后的事件中,在事件激发之前为false。但是,当我在视图中打印出{form['myfield'].$valid}}
时,它仍然保持true
我想这可能是一个计时问题,当指令中运行
setValidity(false)
时,视图已经检查过了。如何修复此问题?将代码包装在$apply中以触发摘要:
app.directive('myDirective', function() {
return {
link: function(scope, elem, attrs) {
elem.on('blur change', function() {
console.log("start valid:" + scope.form[attrs.name].$valid);
scope.$apply(function() {
scope.form[attrs.name].$setValidity('myfield', false);
console.log("end valid:" + scope.form[attrs.name].$valid);
});
});
}
};
});
很酷,以前没有听说过$digest/$apply,但本文简单地解释了:是的,angular不知道的任何代码(如jquery blur/change事件),$apply都需要手动触发摘要周期。