尽管使用谷歌等,我没有找到解决我的问题的方法。谢谢你看看。
我想实现以下输入验证行为(使用angular ngModelController):
输入验证只应在用户首次离开字段后触发。但是,如果存在验证错误,则验证不仅应触发模糊,还应触发更改,以便在纠正错误时立即通知用户。
我创建了一个只有(post)链接函数的指令,它在同一个元素上“需要”s ngModel。
angular.module('foo').directive('errFB', function(){
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, iElem, attrs, ngModel){
// which trigger source / event should I listen on?
// iElem.on, ngModel.$viewChange, scope.$on, scope.$parent.$on?
// iElem.on, seemed the best fit.
xyz.on(..., function(){
if (ngModel.$touched && ngModel.$invalid){
// here validation is not triggered.
// probably, due to having ngModelOptions
// set to only validate on blur?
// could this be changed programmatically?
ngModel.$validate();
}
}
}
}
});
关于触发验证的第二条评论: 我认为这样做是相反的:即首先通过ngModelOptions对'default'(更改)和'blur'进行验证,然后停止验证运行,以防它由'default'触发器引起,当ngModel。$ touch ===假。但禁用验证似乎非常困难,并且与角度的流动相反。
任何建议都表示赞赏。 非常感谢你!
答案 0 :(得分:8)
所以,经过一番长时间的艰苦尝试,我找到了一条路。 实际上它非常简单:
link: function(scope, iElem, attrs, ngModel){
iElem.on("change", function(evt){
if (ngModel.$touched && ngModel.$invalid){
ngModel.$options.updateOnDefault = true;
ngModel.$validate();
}
});
正如您所见,模型。$ options(定义执行modelController' $ validators管道的事件)可以在创建/启动时间之后设置。 对validate的调用将对验证进行排队(将在下一个验证事件上执行)。