2016-12-03 6 views
1

AngularJS V1.0.8で動作するすばらしい日付ドロップダウンがあり、V1.4.2を使用して実行しようとしていますが、ボールを再生したくないようです。AngularJSバージョン1.0.8から1.4.2への変換の問題

何が問題になっているようですか?私はバージョンの変更を調査したが問題を見ることはできない。

私はあなたが1.0.8を使って作業しているのを見ることができますし、5行目と8行目のバージョンを1.4.2に変更すると動作しません。

フィールドが細かいですが、1.4.2

に問題は何をすることができません31/02/2000などのような日付に無効になる必要がありますか?

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; 
    }); 
    } 
}; 
}) 

おかげ

+0

これはあなたを助けるましたか? – tasseKATT

+1

ありがとうございます – wwwredback

答えて

0

はあなたのディレクティブは、おそらく以下の変更により、1.3.0-beta.10で働いて停止します。

ngModel:行います何もなかった場合、$ commitViewValueの入力をダーティにしないでください が変更されました

ビュー値としてオブジェクトを使用しているので:

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

同じオブジェクト参照が解析および検証パイプラインが開始される前に$commitViewValueが変更されたことは何も考えるず、中断されます、使用されます。

$setViewValue状態のドキュメント:標準入力を使用する場合

、ビューの値は常にそのような入力の日付 オブジェクトとして、別の型に解析いくつかの場合には文字列 (あろう[date]。)ただし、カスタムコントロールは オブジェクトをこのメソッドに渡すこともあります。この場合、$ setViewValueに渡す前に オブジェクトのコピーを作成する必要があります。これは、ngModel がオブジェクトの深い監視を実行しないため、変更のためにIDのIDのみを検索するためです。オブジェクトのプロパティのみを変更すると、 ngModelはオブジェクトが変更されたことを認識せず、 が$ parsersおよび$ validatorsパイプラインを呼び出さないことになります。このため、 は、 $ setViewValueに渡されたコピーのプロパティを変更しないでください。そうしないと、スコープのモデル値が に誤って変更されることがあります。

angular.copyを使用すると、それが動作するはずの変更:

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

デモ:https://plnkr.co/edit/kSS56n6LlHej25vcjfQq?p=preview

関連する問題