2013-06-18 60 views
24

我有一个自定义验证指令,当一个字段被更改时正在被正确调用。但是,该字段是否有效也是基于另一个字段的值。如果重要的话,这第二个字段是一个选择列表。当另一个字段被更改时触发字段验证

我想知道是否有某种方式可以手动触发验证当第二个窗体被更改。也许通过使用ng-change事件。处理这样的事情的正确方法是什么?

这里是我的指令:

angular.module('myApp', []). 
    directive('validage', function() { 
     return { 
      require: 'ngModel', 
      link: function (scope, elem, attr, ngModel) { 

       function validate(value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       } 

       //For DOM -> model validation 
       ngModel.$parsers.unshift(function (value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       }); 

       //For model -> DOM validation 
       ngModel.$formatters.unshift(function (value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       }); 
      } 
     }; 
    }); 

如果你是新来AngularJS,我肯定会推荐阅读这些文章2:part 1 & part 2。它们是AngularJS表单的概述。

+0

请参阅StackOverflow上的[this answer](http://stackoverflow.com/a/16886177/2057033)。 – Blackhole

+0

与角1.3这工作在指令:ngModel。$ validate(); –

+2

在anglular 1.2中,您可以使用ngModel $ setViewValue()手动触发$ parser中的所有函数。因此,只需将其设置为:ngModel。$ setViewValue(ngModel。$ viewValue) – likesalmon

回答

0

我最终将指令添加到第二个字段,然后更改指令以将错误消息添加到带有错误的字段。可能有更好的办法,但那是我最终做的。

3

我有一个类似的问题:两个表单字段“间隔”(对于$ scope.monitor.interval)和“超时”(对于$ scope.monitor.timeout),条件是超时不得超过间隔的一半。

首先,我添加了一个自定义验证器来检查这种情况的超时。现在我需要在间隔更改时也触发超时验证程序。如果没有“如果”超时值时得到的对话框中去掉intialisation

function EditMonitorCtrl($scope, $log, dialog, monitor) { 
    $scope.monitor = monitor; 

    ... 

    // trigger validation of timeout field when interval changes 
    $scope.$watch("monitor.interval", function() { 
     if ($scope.editMonitorDlg.timeout.$viewValue) {   
      $scope.editMonitorDlg.timeout.$setViewValue($scope.editMonitorDlg.timeout.$viewValue); 
     } 
    }); 
} 

:我通过观察模型的monitor.interval属性实现这一点。

44

经过多次搜索后,我发现只需在所需的字段上调用$validate()即可触发验证。
因此,举例来说,如果你的窗体名为my_form(即在标记的形式标记有一个name="my_form"属性),并要验证的字段的名称日期(在标记输入字段有name="date"属性),则根据您的建议,只要调用ng-change函数,就可以使用第二个字段的ng-change事件,并调用$scope.my_form.date.$validate();

+7

谢谢!这也可以在调用ngModel的指令中起作用。$ validate(); ..例如,如果你有你观察到的属性,你可以重新验证模型:) –

+0

哪个版本的角度是可用的?我使用1.2.18,而我没有看到$ validate()函数。 –

+1

我使用的是版本1.3.2。 '$ validate()'从版本1.3.0开始可用。顺便说一句,你可以在这里看到关于ngmodel和字段名称之间关系的更多信息:https://code.angularjs.org/1.3。0/docs/guide/forms,在_Binding下形成和控制state_。 – gneri

0

我无法获得ng-blur="myForm.myField.$validate()"在AngularJS 1.5中的工作,可能是因为myField的模型为空。

但是,ng-blur="myForm.myField.$setTouched()"确实工作。

相关问题