提交时强制验证

时间:2014-02-05 11:17:25

标签: angularjs

我正在使用下面的指令验证输入元素。问题是这种方式只在激活输入元素时执行。有没有办法强制执行表单的所有输入元素的解析器方法?

"use strict";

angular.module("kap.directive")
    .directive('kapValidationDuration', ['$timeout', '$log', function ($timeout, $log) {
        return {
            restrict: 'A',
            require: 'ngModel',
            scope: { minReservationDurationMinutes: '=minReservationDurationMinutes' },
            link: function (scope, element, attrs, ctrl) {
                if (attrs.type === 'radio' || attrs.type === 'checkbox') {
                    return;
                }

                ctrl.$parsers.push(function (value) {
                    if(value && !element[0].hidden) {

                        var lTimeValues = value.split(":"),
                        lHoursToMinutes = parseInt(lTimeValues[0], 10) * 60,
                        lMinutes = parseInt(lTimeValues[1], 10),
                        lMinReservationDurationMinutes = parseInt(attrs.minreservationdurationminutes, 10) || 10,
                        lValidity = true;


                    if ((lHoursToMinutes + lMinutes) < lMinReservationDurationMinutes) {
                        lValidity = false;
                    }

                    ctrl.$setValidity('kapValidationDuration', lValidity);
                    }

                    return value;
                });
            }
        };
    }]);

1 个答案:

答案 0 :(得分:1)

为了做到这一点,即验证初始值,您还必须使用$formatters。 Luckilly,在您的情况下,您只需要unshift 相同的函数$formatters,就像$parsers一样。

原因是在进行表单→模型时使用了解析器。通常,这意味着数据转换:如果模型是数字,则用户的输入始终是字符串,必须进行转换;错误不仅可以是验证(例如“年龄必须为正”)而且还可以解析(例如“'tata'不是有效数字”)。格式化时的模型→形式。顾名思义,这就是格式化:例如: Date对象可能需要在我的语言环境(希腊语)中显示为dd/MM/yyyy,而在其他语言环境中显示为MM/dd/yyyy

看到这个小提琴:http://jsfiddle.net/52dAB/

在小提琴中,我仍然使用格式化程序和解析器的两个单独的函数,尽管它们在实现中是相同的。只是为了普遍性。