2015-10-06 2 views
3

Я пытаюсь обновить с Angular 1.2 до 1.4. Я столкнулся с проблемой с моими вводами данных, так как Angular теперь требует, чтобы значение было объектом Date вместо строки. Я смог решить это, создав директиву, которая преобразует строковое значение в объект Date. Это отлично работает в Chrome, однако, когда я открываю форму для редактирования в браузере, не совместимом с HTML5, дата не отображается. В соответствии с документацией «Угловая» ниже мое значение должно отображаться до тех пор, пока оно находится в формате ISO.AngularJS: ввод только даты отображается в Chrome

В браузерах, которые еще не поддерживают ввод даты HTML5, будет использоваться текстовый элемент. В этом случае текст должен быть введен в допустимом ISO-8601 формата даты (ГГГГ-ММ-ДД), например: 2009-01-06 (https://docs.angularjs.org/api/ng/input/input%5Bdate%5D)

Это моя директива, которая работает отлично подходит для Chrome

.directive('formatDate', -> 
    require: 'ngModel' 
    link: (scope, elem, attr, modelCtrl) -> 
    modelCtrl.$formatters.push((modelValue) -> 
     new Date(modelValue + "CST")) 
) 

пытался использовать это в моей директиве вместо этого, но это, кажется, возвращает строку вместо даты так угловой выдает ошибку

$filter('date')(modelValue, 'yyyy-MM-dd') 

в моем HTML я пытался использовать нг-инициализацию для инициализировать значение для формы как sug в этом thread, однако это тоже не сработало.

<input class="form-control" type="date" ng-init="params.effective_date=(params.effective_date | date:'yyyy-MM-dd')" ng-model="params.effective_date" format-date /> 

Любая помощь будет оценена по достоинству, так как я пока не смог найти способ решить эту проблему.

ответ

1

Я, наконец, выяснил проблему, именно так я создал дату в моей директиве.

new Date(modelValue + "CST")) 

Добавление часового пояса в конец строки поддерживается Chrome, но не IE, Firefox и Safari. Они возвращают ошибку Invalid Date.

Для решения проблемы я изменил свою директиву, чтобы добавить смещение часового пояса CST в течение 5 часов, чтобы гарантировать, что дата всегда будет отображаться в виде как 2015-10-08. Когда запись сохранена, она отключит время, так как мы не заботимся об этом. Эти изменения при необходимости, поскольку Chrome отображает дату в формате UTC, в то время как другие браузеры отображают ее в локальном часовом поясе. Например, 2015-10-08:00:00:00.000Z CST - 2015-10-07T19:00:00.000Z UTC. В результате та же самая дата будет отображаться в форме редактирования как 10/7/2015 в Chrome и 2015-10-08 в IE, Firefox и Safari.

.directive('formatDate', -> 
    require: 'ngModel' 
    link: (scope, elem, attr, modelCtrl) -> 
    modelCtrl.$formatters.push((modelValue) -> 
     new Date(modelValue + "T05:00:00.000Z")) 
    modelCtrl.$parsers.push((viewValue) -> 
     iso_date = viewValue.toISOString() 
     iso_date.split("T")[0]) 
) 
Смежные вопросы