使用ng-change进行日期输入验证,AngularJS

时间:2014-05-11 17:51:40

标签: javascript angularjs datepicker angular-ui-bootstrap angularjs-ng-change

我在我的页面中使用了AngularJS和AngularJS bootstrap。我有一个日期选择器指令,如下所示:

    <div class="form-group {{dateStatus.class}}">
        <p class="input-group">
            <input type="text" id="inpDate" class="form-control" 
                   datepicker-popup="dd-MMMM-yyyy" ng-model="task.date" 
                   is-open="datePickerStatus.isOpen" min-date="minDate" 
                   datepicker-options="dateOptions" ng-required="true" 
                   close-text="Close" placeholder="Due date" 
                   ng-change="checkDateValidity()"
            />
            <span class="input-group-btn">
                <button type="button" class="btn btn-default" 
                        ng-click="openDatePicker($event)"
                >
                    <i class="glyphicon glyphicon-calendar"></i>
                </button>
            </span>
        </p>
    </div>

要验证日期输入,在我的控制器中我有以下功能:

        $scope.checkDateValidity = function(){
        var date,
            isValid,
            taskDate;
        taskDate = $scope.task.date;
        date = new Date(taskDate);
        isValid = !isNaN(date);
        if(isValid) {
            $scope.addButtonState.isOk = true;
            $scope.dateStatus.class = '';
        }
        else{
            $scope.addButtonState.isOk = false;
            $scope.dateStatus.class = 'has-error';
        }
    }

一切正常,可以检查插入的日期是否有效,但问题是当日期输入留空(或从有效状态更改为空白)  我希望它也可以被接受,但由于空输入和无效日期都是undefined我不知道如何在两种情况之间声明。

我还想过直接读取输入文本:

document.getElementById('inpDate').value

但是当值改变时会触发ng-change,并且我留下了之前没用的前一个值......

感谢您的时间和回应。

3 个答案:

答案 0 :(得分:7)

更好的验证方法是使用指令添加验证规则。

.directive("validateDate", function() {
     return {
         require: 'ngModel',
         link: function(scope, elm, attrs, ctrl) {
             ctrl.$validators.validateDate = function(modelValue, viewValue) {
                 if(!isNaN(modelValue) || ctrl.$isEmpty(modelValue)){
                     return true;
                 }
                 return false;
             };
         }
     };
 })

然后你只需要在输入标签中添加validate-date,验证会将输入标记为有效,如果是!isNaN(当日期是数字或为空时)

答案 1 :(得分:2)

您可以通过将验证程序回调绑定到#inpDatechange事件来轻松验证keyup值,然后当您的回调触发时,您可以检查输入的有效性。

$timeout(function(){        
    angular
        .element(document.getElementById('inpDate'))
        .bind('keyup change', function(){
            var inputValue,
                customDate,
                isValid;

            inputValue = this.value;
            if(inputValue != ''){
                customDate = new Date(inputValue);
                isValid = !isNaN(customDate);

                if(isValid){
                    console.log('Valid');
                    // do something
                }
                else{
                    console.log('Invalid');
                    // do something else
                }
            }
            else{
                console.log('Empty');
                // do something else
            }
        });
}, 400);

请确保您已在控制器中注入$timeout

答案 2 :(得分:-1)

如果您想验证,那么您可以使用

if(document.getElementById('inpDate').value === "" ){
            $scope.addButtonState.isOk = true;
            $scope.dateStatus.class = '';
}

这是$scope.checkDateValidity函数

的开头