从AngularJS版本1.0.8转换为1.4.2的问题

时间:2016-12-03 21:59:22

标签: javascript angularjs

我有一个可爱的日期下拉列表,适用于AngularJS V1.0.8,我试图使用V1.4.2运行它,但它似乎并不想玩球。

似乎是什么问题?我已经研究了版本的变化,但无法看到问题。

我有一个plunker,你可以看到它使用1.0.8工作,然后当你将第5行和第8行的版本更改为1.4.2时,它不起作用。

这些字段对于31/02/2000等日期应该无效,这是好的但不是在1.4.2

问题是什么?

https://plnkr.co/edit/5ckBkzN6xYEvJvyoO0Ax?p=preview

angular.module('dateApp', []);
angular.module('dateApp'). 
 directive('dateTypeMulti', function () {
return {
  require: 'ngModel',
  link: function (scope, element, attrs, ngModel) {
    ngModel.$render = function () {
      angular.extend(scope.$eval(attrs.dateTypeMulti), ngModel.$viewValue);
    };

    scope.$watch(attrs.dateTypeMulti, function (viewValue) {
      ngModel.$setViewValue(viewValue); 
    }, true);

    ngModel.$formatters.push(function (modelValue) {
      if (!modelValue) return;

     var parts = String(modelValue).split('/');

      return {
        year: parts[0],
        month: parts[1],
        day: parts[2]
      };
    });

    ngModel.$parsers.unshift(function (viewValue) {
      var isValid = true,
          modelValue = '',
          date;

      if (viewValue) {
        date = new Date(viewValue.year, viewValue.month - 1, viewValue.day);
        modelValue = [viewValue.year, viewValue.month, viewValue.day].join('/');

        if ('//' === modelValue) {
          modelValue = '';
        } else if (
            date.getFullYear() != viewValue.year ||
            date.getMonth() != viewValue.month - 1 ||
            date.getDate() != viewValue.day) {
          isValid = false;
        }
      }

      ngModel.$setValidity('dateTypeMulti', isValid);

      return isValid ? modelValue : undefined;
    });
  }
};
})

由于

1 个答案:

答案 0 :(得分:0)

您的指令在 1.3.0-beta.10 中停止工作,可能是因为以下更改:

  

ngModel:如果没有,则不会弄脏$ commitViewValue上的输入   改变

由于您使用对象作为视图值:

scope.$watch(attrs.dateTypeMulti, function (viewValue) {
  ngModel.$setViewValue(viewValue); 
}, true);

将使用相同的对象引用,$commitViewValue将认为在解析和验证管道开始之前没有任何改变和中止。

$setViewValue州的文档:

  

与标准输入一起使用时,视图值将始终为字符串   (在某些情况下,它被解析为另一种类型,例如Date   输入的对象[日期]。)但是,自定义控件也可能通过   这个方法的对象。在这种情况下,我们应该复制一份   对象在传递给$ setViewValue之前。这是因为ngModel   没有深入观察物体,它只会寻找变化   身份。如果只改变对象的属性   ngModel将不会意识到对象已更改,也不会   调用$ parsers和$ validators管道。出于这个原因,你   一旦传递给副本,就不应该更改副本的属性   $ setViewValue。否则,您可能会导致范围上的模型值   改变不正确。

更改为使用angular.copy,它应该有效:

ngModel.$setViewValue(angular.copy(viewValue))

演示: https://plnkr.co/edit/kSS56n6LlHej25vcjfQq?p=preview