4

現在までのユーザー入力を解析して検証するディレクティブが必要です。だから私は次のように書いた:

myDirectives.directive('myDate', function($filter) {
    'use strict';
    return {
        require:'ngModel',
        restrict:'A',
        link:function (scope, elem, attrs, ctrl) {
            var dateFormat = attrs.myDate ? attrs.myDate : 'shortDate';

            ctrl.$formatters.unshift(function(modelValue) {
                return $filter('date')(modelValue, dateFormat);
            });
            ctrl.$parsers.unshift(function(viewValue) {
                var date = new Date(viewValue);

                if (isNaN(date)) {
                    ctrl.$setValidity('date', false);
                    return undefined;
                } else {
                    var dateString = $filter('date')(date, dateFormat);
                    if (dateString !== viewValue) {
                        ctrl.$setViewValue(dateString);
                    }
                    ctrl.$setValidity('date', true);
                    return date;
                }
            });
        }
    };
});

解析は、入力がフォーカスを失った後にのみ行う必要があるため、ここで見つけた別のディレクティブを使用します。問題は

ctrl.$setViewValue(dateString);

angularjsのドキュメントに示されているように、 setViewValue() はDOMイベントハンドラー内から呼び出す必要があるため、機能しません。解析結果を反映するにはどうすればよいですか?

4

4 に答える 4

2

文字列を Date オブジェクトに変換する日付パーサーを作成しました。使用している日付形式と日付ロケールを指定することもできます。入力に応じて、有効またはそれ以外の Date オブジェクトを返します。

このパーサーを実装するディレクティブもあるので、たとえば入力フィールドで使用できます。

https://github.com/dnasir/angular-dateParser

于 2014-02-19T21:48:09.613 に答える
-1

htmlで:

<input class="form-control""
type="date"
string-to-date
ng-model="val.VAL">

コントローラーでディレクティブを作成します

.directive('stringToDate', function() {
    return {
      require: 'ngModel',
      link: function(scope, element, attrs, ngModel) {
        ngModel.$parsers.push(function(value) {
          return new Date(value);
        });
        ngModel.$formatters.push(function(value) {
          var fechaactual = new Date(value);
          return fechaactual;
        });
      }
    };
  })

ディレクティブはstringToDateを呼び出し、htmlでstring-to-dateとして呼び出す必要があることに注意してください。理由はありません:)

于 2016-03-20T01:16:34.120 に答える