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

时间:2014-12-16 16:36:42

标签: angularjs validation 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();
            }
          }
        }
    }
});

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

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

1 个答案:

答案 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的调用将对验证进行排队(将在下一个验证事件上执行)。