1

我在Angular 1.4.9中使用JqueryUI datepicker(1.0.0)指令来显示出生日期。该字段不是必需的,除非填充,否则不应验证。Angular UI datepicker在空时验证为false

页面加载后,该字段被验证为真(如预期)。一旦用户选择一个日期,它再次有效。但是,如果我们要手动删除该字段,则该字段将变为无效。

<input ui-date="dateOptions" name="dateOfBirth" ng-model="dob"/> 

ng-model可以设置为前后相同的值,但是值保持无效。

我已经创建了一个JSFiddle来复制这里的问题。 https://jsfiddle.net/nipuna777/ctsmuv80/

+1

看起来是在指令的错误,它不检查该字段是否需要与否和验证的价值 - '返回_angular2.default.isDate(uiDateConverter.stringToDate( attrs.uiDateFormat,viewValue));' –

+0

@ArunPJohny有没有办法禁用此验证或覆盖它? – nipuna777

回答

1

正如所说@ nipuna777,它看起来像在日期选择器中的错误。

我们可以通过指令修复它。

jsfiddle上的示例。

var myApp = angular.module('myApp', ['ui.date']); 
 

 
myApp.directive('uiDateFix', function($timeout) { 
 
    return { 
 
    restrict: "A", 
 
    require: 'ngModel', 
 
    priority: 100, 
 
    scope: { 
 
     ngRequired: "=" 
 
    }, 
 
    link: function(scope, elem, attr, ngModel) { 
 
     var originalValidate = null; 
 
     $timeout(function() { 
 
     if (!originalValidate) 
 
      originalValidate = ngModel.$validators.uiDateValidator; 
 
     ngModel.$validators.uiDateValidator = function uiDateValidator2(modelValue, viewValue) { 
 
      //Define correct validations 
 
      if (viewValue || scope.ngRequired) 
 
      return originalValidate(modelValue, viewValue); 
 
      else 
 
      return true; 
 
     } 
 
     }, 500); 
 
    } 
 
    } 
 
}); 
 
//myApp.factory('myService', function() {}); 
 

 
myApp.controller('MyCtrl', function($scope) { 
 
    $scope.name = 'Superhero'; 
 
    $scope.value = 'Superhero'; 
 
    $scope.dateOptions = { 
 
    changeYear: true, 
 
    changeMonth: true, 
 
    yearRange: '1900:-0' 
 
    }; 
 
    $scope.isReq = true; 
 
    $scope.dob = "" 
 
})
<script src="https://code.jquery.com/jquery-2.2.1.js" charset="utf-8"></script> 
 
<script src="https://code.jquery.com/ui/1.11.3/jquery-ui.js" charset="utf-8"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.9/angular.js" charset="utf-8"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-date/1.0.0/date.js" charset="utf-8"></script> 
 
<link rel="stylesheet" type="text/css" href="https://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css"> 
 

 

 
<body ng-app="myApp"> 
 
    <div ng-controller="MyCtrl"> 
 
    <h1> Datepicker</h1> 
 
    <form name="person"> 
 
     <label for="dateOfBirth">Date of Birth: </label> 
 
     <input ui-date="dateOptions" name="dateOfBirth" ng-model="dob" ui-date-fix ng-required="isReq" /> 
 
     <label for="isReq">Required </label> 
 
     <input type="checkbox" name="isReq" ng-model="isReq" /> 
 
     <p> 
 
     dob value: {{dob}} 
 
     </p> 
 
     <p> 
 
     dob valid: {{person.dateOfBirth.$valid}} 
 
     </p> 
 
     <p> 
 
     dob errors: {{person.dateOfBirth.$error}} 
 
     </p> 
 

 
     <hr> 
 

 
     <h2>Recreating the problem</h2> 
 
     <ol> 
 
     <li>With the field empty dob is valid</li> 
 
     <li>When you select a value from datepicker again the dob field is valid</li> 
 
     <li>When dob is manually removed, the field becomes invalid</li> 
 
     </ol> 
 

 
    </form> 
 
    </div> 
 
</body>

+0

为什么你需要一个解决方法,如果它已经在插件中修复了 –

+0

我在回答固定版本的指令'ui-date'后添加了我的答案。当然,最好使用固定版本的指令'ui-date'。 –