参考这个插件:http://plnkr.co/edit/GzC9ufa1WJmKQ6Ad15v9?p=preview
我有一个运行测试的指令,然后用结果调用$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。在后续事件中,事件触发前它是错误的。但是,当我在视图中打印{{form['myfield'].$valid}}
时,无论如何都会true
。
我想这可能是一个时间问题,在指令运行setValidity(false)
时,视图已经检查过了。我该如何解决这个问题?
答案 0 :(得分:1)
将您的代码包裹在$ 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);
});
});
}
};
});