如何在初始化后触发对其他事件的ngModel验证

tik*_*ike 3 validation angularjs angularjs-directive

尽管使用谷歌等,我没有找到解决我的问题.谢谢你看看.

我想实现以下输入验证行为(使用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();
            }
          }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

关于触发验证的第二条评论:我认为反之亦然:即首先通过ngModelOptions对'default'(更改)和'blur'进行验证,然后停止验证运行,以防它由'default'引起'触发,当ngModel.$ touch === false.但禁用验证似乎非常困难,并且违背角度流.

任何建议都表示赞赏.非常感谢你!

tik*_*ike 8

所以,经过一番漫长的努力,我找到了一条路.其实这很简单:

link: function(scope, iElem, attrs, ngModel){
    iElem.on("change", function(evt){
        if (ngModel.$touched && ngModel.$invalid){
            ngModel.$options.updateOnDefault = true;
            ngModel.$validate();
        }
 });
Run Code Online (Sandbox Code Playgroud)

正如您所见,模型.$ ​​options(定义执行modelController的$ validators管道的事件)可以在创建/启动时间之后设置.对validate的调用将对验证进行排队(将在下一个验证事件上执行).