将角度从1.2更新为1.3打破了我的指示

use*_*164 8 javascript datepicker twitter-bootstrap angularjs

我有以下指令,我把它放在使用angular-ui-bootstrap datepicker的输入字段上:

angular.module('directives.validators.date', [])
.directive('validDate',[ '$filter', function ($filter) {
  return {
    restrict:'A',
    require:'ngModel',
    link: function  (scope, el, attrs, ngModel) {
      var pattern = /^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d\d$/;
      ngModel.scope = scope;
      ngModel.attrs = attrs;
      el.on('blur',function() {
        if(typeof ngModel.$viewValue === "object"){        
          var str = $filter('date')(ngModel.$viewValue, "dd.MM.yyyy");
          ngModel.$setViewValue(str);
        }

        if(ngModel.$viewValue){
          if(ngModel.$viewValue!=="" && !pattern.test(ngModel.$viewValue)){
              ngModel.$setValidity("date",false);
          }
        }
      });

      scope.$watch(function () {
          return ngModel.$modelValue;
        }, 
        function() {
        if(ngModel.$pristine){ //if the data has just been fetched, convert it to date format.
          if (typeof ngModel.$viewValue === "number"){
            var date = new Date(ngModel.$viewValue);
            //var str = $filter('date')(date, "dd.MM.yyyy");
            ngModel.$setViewValue(date);
            ngModel.$setPristine(true);
            var formName = $("form")[0].name;
            ngModel.scope[formName].$setPristine(true);
            ngModel.$setValidity("date",true);
          }
        }
        if(ngModel.$viewValue){ //when the filed is changed, if it is corrected set that the date is valid
          if(ngModel.$viewValue==="" || pattern.test(ngModel.$viewValue)){
            ngModel.$setValidity("date",true); 
          }
        }
      });
    }
  };
}]);
Run Code Online (Sandbox Code Playgroud)

我遇到了datepicker组件的问题,如果没有触及datepicker字段,我的表单就不会提交(即使它有数据,例如我编辑资源时).即使提交了一个好日期,它也基本上将表格视为无效.该指令修复了这一点,但是当我将angular升级到1.3时,指令不再有效.

我需要更改什么才能使该指令再次起作用?

7uc*_*uc4 0

在这里您可以找到有关 1.3 中影响 ngModel 的重大更改的信息:

由于 HTML5 模式验证约束会验证输入值,因此我们还应该针对 viewValue 进行验证。虽然这在 Angular 1.2 之前的核心中都有效,但在 1.3 中,我们不仅更改了验证,还更改了input[date]和 的input[number]处理方式 - 它们分别将输入值解析为Date和Number,而这不能通过正则表达式进行验证......