AngularJS ввод даты французский

Я хотел использовать input[date] внутри формы, чтобы позволить пользователям использовать поддержку современных браузеров, не используя javascript datepicker. Для тех, кто использует не поддерживающие браузеры, я установил маску пользовательского интерфейса. Оба работают вместе. Я использую французский формат (дд / мм / ГГГГ).

<input type="date" ng-model="myDate" ui-mask="99/99/9999">
$scope.myDate = new Date("2016-02-12"); // works
$scope.myDate = "12/02/2016"; // Doesn't...

В пустом виде, без проблем, Angular принимает это. Но с заполненной формой Angular ожидает формат даты, который мне не нужен: YYYY-mm-dd (объект даты javascript).

Я не могу понять, почему Angular поддерживает только этот формат, а не другие, такие как французский формат. Потому что я хочу, чтобы на входе [date] отображался французский формат, а не стандартный!

Многие современные браузеры предоставляют интересную поддержку для дат, я не могу понять, почему Angular это тратит.

А может я что то пропустил?

1 ответ

Для достижения вашей цели нужно использовать momentJs а также ngModel$parsers а также $formatters, Ниже приведен пример кода и JSFiddle:

В вашем контроллере вы подготавливаете строковое значение во французском формате даты:

$scope.myDate= '12/02/2016';

Ввиду этого вы устанавливаете это значение на атрибут ngModel input[type=date] элемент:

<input class="form-control" type="date" ng-model="myDate">

Вам нужно создать новую директиву, ее можно назначить input элемент:

.directive('input', function(dateFilter) {
    return {
        restrict: 'E',
        require: '?ngModel',
        link: function(scope, element, attrs, ngModel) {
            if (
                'undefined' !== typeof attrs.type && 'date' === attrs.type && ngModel
            ) {
                ngModel.$formatters.push(function(modelValue) {
                    return moment(modelValue, "DD/MM/YYYY").toDate();
                });

                ngModel.$parsers.push(function(viewValue) {
                    return moment(viewValue).format("DD/MM/YYYY");
                });
            }
        }
    }
})

Новая функция в $formatters массив изменяет ваш myDate к объекту даты javascript (с парсером момента это довольно просто). Новая функция в массиве $parsers изменяет значение входного элемента обратно во французскую строку даты.

Это решение обеспечивает двустороннюю связь между вашим myDate а также input[type=date] элемент.:)

Посмотрите на пример JSFiddle

Другие вопросы по тегам