AngularJs BootstrapUI Datepicker验证

时间:2014-06-25 14:17:50

标签: angularjs validation datepicker angular-ui-bootstrap

我需要验证日期选择器的日期并限制年份(例如,避免使用15-05-9999)。

这是我的HTML代码:

 <p class="input-group">
                        <input type="text" name="raisedOnDate" class="form-control" ng-model="date" ng-disabled="!viewSearchEvent.raisedOnActive"
                               datepicker-popup="{{format}}" is-open="opened1" datepicker-options="dateOptions" date-validator required />
                        <span class="input-group-btn">
                            <button type="button" class="btn btn-default" ng-click="open($event,'on')"><i class="glyphicon glyphicon-calendar"></i></button>
                        </span>
                    <p ng-show="!searchEventsForm.$valid" style="color: red;">Date is invalid!</p>
                    <p ng-show="searchEventsForm.$valid" style="color: green;">Date is valid!</p>

这是在<form name="searchEventsForm" role="form" class="form-horizontal" novalidate>内。

我制定了这个指令来验证日期类型:

app.directive('dateValidator', function() {
return {
    require: 'ngModel',
    link: function (scope, elem, attr, ngModel) {
        function validate(value) {

            var d = Date.parse(value);

            // it is a date
            if (isNaN(d)) { // d.valueOf() could also work
                ngModel.$setValidity('valid', false);
            } else {
                ngModel.$setValidity('valid', true);
            }
        }

        scope.$watch(function () {
            return ngModel.$viewValue;
        }, validate);
    }
};

});

但是,我可以输入日期,如25-05-999999999,这不是主意。

我设法让它工作,所以如果它是一个日期,它会显示一条消息“日期有效”,如果不是“日期无效”。

但我被困在那里。

关于如何设置年限和字符限制并使其有效的任何想法?

我已尝试使用max-datemax和其他人。

如果您需要更多信息,我不知道它是否足够清楚或者说得好。 感谢您的帮助! ;)

3 个答案:

答案 0 :(得分:7)

为什么不使用ng-pattern?而不是制定新的指令。

在此处详细了解NG-PATTERN DOCS

 ng-pattern="/^(\d{4})-(\d{2})-(\d{2})$/"

使用更好的解决方案来看看这个小提琴

validate datepicker using ng-pattern

答案 1 :(得分:6)

在html上使用了这个:maxlength="10"来限制字符。

这是为了验证日期格式是否正确(避免1/1/1或11/06/201):

MyDirective.directive('dateValidator', function() {
     return {
         require: 'ngModel',
         link: function (scope, elem, attr, ngModel) {
             function validate(value) {
                 if (value !== undefined && value != null) {
                     ngModel.$setValidity('badDate', true);
                     if (value instanceof Date) {
                         var d = Date.parse(value);
                         // it is a date
                         if (isNaN(d)) {
                             ngModel.$setValidity('badDate', false);
                         }
                     } else {
                         var myPattern = new RegExp(/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/);
                         if (value !='' && !myPattern.test(value)) {
                             ngModel.$setValidity('badDate', false);
                         }
                     }
                 }
             }

             scope.$watch(function () {
                 return ngModel.$viewValue;
             }, validate);
         }
     };
});

仍未设法确定最小日期和最长日期,但并不紧急。 希望它可以在未来的问题上帮助人们。

答案 2 :(得分:-1)

您的解决方案使用'scope。$ watch'来执行ngModel的'$ parsers'和'$ formatters'。看看这里: https://docs.angularjs.org/api/ng/type/ngModel.NgModelController