Форматировать значение модели как дату angularjs - PullRequest
1 голос
/ 25 апреля 2019

Я улучшаю и автоматизирую определенные вещи в старом веб-приложении.Одним из них является формат даты.Мы привыкли обрабатывать их с помощью функций jquery, а теперь мы делаем это с помощью angularjs.

Для ввода мы используем директиву, и она отлично работает.Проблема возникает, когда она не используется, директива не выполняется и значение модели остается без правильного значения.

Директива:

app.directive('formatDate', function($filter) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attrs, modelCtrl) {            
            // format text (model to view)
            modelCtrl.$formatters.push(function(value) {
                if(value !== "" && typeof value !== "undefined" && value !== null){                
                    return value.split("-").reverse().join("/");
                }
            });

            // format text (view to model)
            modelCtrl.$parsers.push(function(value) {
                if(value !== "" && typeof value !== "undefined" && value !== null){                    
                    var date = new Date(value.split("/").reverse().join("-"));
                    date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
                    return date;                    
                }
            });
        }
    };
});

Проблема:

При загрузке значения из веб-службы, например: « invoice.date » поступает из базы данных в формате « гггг-мм-дд ».Он загружается во входные данные в формате « дд / мм / гггг » и, если ввод редактируется, значением модели является «Объект даты» благодаря директиве.Но если поле не редактируется, значение остается « гггг-мм-дд », и эта строка вызывает ошибки.(Примечание: они используют веб-сервисы с jpa, и я не могу ничего изменить в серверной части)

Как отформатировать значение перед отправкой, не выполняя ручную проверку и анализ значения в каждой функции?Могу ли я использовать $ watch для каждой из переменных, не вызывая конфликта с директивой или бесконечным циклом?У Angular есть какой-то другой способ автоматизировать это?

Спасибо за любую помощь.

1 Ответ

1 голос
/ 27 апреля 2019

Я видел это много раз, это довольно часто, и вы используете время, потому что jpa или база данных изменяют дату, потому что часовой пояс, верно?

Хорошо, тогда это из веб-службы, поэтому, вероятно, в формате json. Вы можете просто преобразовать объект даты перед тем, как назначить его значению модели и, таким образом, всегда использовать этот формат. Другой способ - конвертировать его перед отправкой, и вы уже сказали, что этого хотите избежать.

Есть много вещей, которые можно сделать. Подведем итог:

(выберите один)

  1. Преобразование формата при получении и перед его назначением. или руководство, простым javascript или любым другим методом.
  2. На обратной стороне перед отправкой измените формат.
  3. Чтобы не делать это вручную, ищите его с помощью функций или событий, если $ watch может использоваться, чтобы определить, в каком формате он появляется, и изменить его правильно. Поэтому, если он назначен программно, он также будет работать.
  4. Существуют и другие методы фильтрации и уточнения ответа, но я думаю, это было бы слишком для этого случая. Как сказал Хорхе, есть некоторые плагины, инструменты и многое другое, которые можно добавить. Но я всегда стараюсь избегать перегрузок многими вещами.

Проблема состоит в том, чтобы попытаться автоматизировать с помощью angularjs, потому что есть много способов, и найти «правильный» путь сложно, так как каждый проект индивидуален и у каждого человека свое мышление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...