簡體   English   中英

從AngularJS版本1.0.8轉換為1.4.2的問題

[英]Issues converting from AngularJS Version 1.0.8 to 1.4.2

我有一個可愛的日期下拉列表,適用於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.3.0-beta.10中停止工作,可能是因為以下更改:

ngModel:如果沒有更改,請不要弄臟$ commitViewValue上的輸入

由於您使用對象作為視圖值:

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

將使用相同的對象引用, $commitViewValue將在解析和驗證管道啟動之前認為沒有任何更改和中止。

$setViewValue的文檔說明:

與標准輸入一起使用時,視圖值將始終為字符串(在某些情況下,它會被解析為另一種類型,例如輸入[date]的Date對象。)但是,自定義控件也可能將對象傳遞給此方法。 在這種情況下,我們應該在將對象傳遞給$ setViewValue之前復制該對象。 這是因為ngModel不會對對象進行深度監視,它只會查找身份的更改。 如果只更改對象的屬性,則ngModel將不會意識到對象已更改,並且不會調用$ parsers和$ validators管道。 因此,一旦將副本傳遞給$ setViewValue,就不應該更改副本的屬性。 否則,您可能會導致范圍上的模型值更改不正確。

更改為使用angular.copy ,它應該工作:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM