Ошибка: [ngModel: datefmt] Ожидаемая `2015-05-29T19: 06: 16.693209Z` дата - Angular
Я работаю над приложением angular
с Django
с rest-framework
..
Приложение получает информацию с json с сервера. Один из ключей - created_time
... Значение этого поля соответствует формату iso-8601
, например 2015-05-29T19:06:16.693209Z
.
В клиенте у меня есть поле:
<input type="time" ng-model="created_time">
Но когда данные поступают, я получаю эту ошибку:
Error: [ngModel:datefmt] Expected `2015-05-29T19:06:16.693209Z` to be a date http://errors.angularjs.org/1.3.13/ngModel/datefmt?p0=2015-05-29T19%3A06%3A16.693209Z
at REGEX_STRING_REGEXP (angular.js:63)
at Array.<anonymous> (angular.js:19807)
at Object.ngModelWatch (angular.js:23289)
at Scope.$get.Scope.$digest (angular.js:14235)
at Scope.$get.Scope.$apply (angular.js:14506)
at done (angular.js:9659)
at completeRequest (angular.js:9849)
at XMLHttpRequest.requestLoaded (angular.js:9790)
Я уже пробовал все:( формат точно соответствует инструкциям в документах angular...
Ответы
Ответ 1
Это должно происходить с angular 1.3+. 1.3+ в wards-моделях ng-model для ввода даты/времени должен быть допустимым объектом даты, строковое представление даты больше не разрешено. Вам нужно преобразовать объект string to date ($scope.created_time = new Date(dateString)
) и привязать его к ng-модели. Если вы следуете ссылке об ошибке, у него есть четкое описание ошибки и способы ее устранения.
Все связанные с датой ввода данные, например, требуют, чтобы модель была объектом Date. Если модель является чем-то другим, эта ошибка будет выбрана. angular не устанавливает ошибки проверки в этом случае, поскольку эти ошибки отображаются пользователю, но ошибочное состояние было вызвано неправильной логикой приложения, а не пользователем.
Ответ 2
Если вы получаете данные из службы REST, вы можете просто преобразовать свои поля в Date.
$http.get(url).success(function(data){
$scope.data = data; // get row data
$scope.data.mydatefield = new Date($scope.data.mydatefield); // convert filed to date
});
Ответ 3
Создайте простую директиву, которая преобразует значение модели:
HTML:
<input date-input type="time" ng-model="created_time">
Директива
app.directive('dateInput', function(){
return {
restrict : 'A',
scope : {
ngModel : '='
},
link: function (scope) {
if (scope.ngModel) scope.ngModel = new Date(scope.ngModel);
}
}
});
Ответ 4
В дополнение к ответу PSL.
Вот как переопределить требования angular 1.3+ как объект Date.
<input type="date" ng-model="book.date" date-format/>
app.directive('dateFormat', function() {
return {
require: 'ngModel',
link: function(scope, element, attr, ngModelCtrl) {
//Angular 1.3 insert a formater that force to set model to date object, otherwise throw exception.
//Reset default angular formatters/parsers
ngModelCtrl.$formatters.length = 0;
ngModelCtrl.$parsers.length = 0;
}
};
});
Он может использоваться с AngularFire $firebaseObject и отлично работает с привязкой $bindTo на 3 пути. Не нужно расширять услугу $firebaseObject. Он работает в приложениях Ionic/cordova.
Рабочий пример в jsfiddle
На основе этот ответ
Ответ 5
Проблема На самом деле это проблема формата даты, я решил эту проблему, используя этот фрагмент кода.
Решение: Ниже фрагмент кода решит эту проблему:
var options = {
weekday: "long", year: "numeric", month: "short",
day: "numeric", hour: "2-digit", minute: "2-digit"
};
$scope.created_time = $scope.created_time.toLocaleTimeString("en-us", options);
где en-us format = "Пятница, 1 февраля 2013 г. 06:00", надеюсь, что это поможет другим решить проблему, я столкнулся с такой ошибкой и решил с этим.
Ответ 6
У меня была эта ошибка, и я непосредственно использовал объект: я отправляю решение, которое я выполнил:
1: $userData.dob = новая дата (userData.dob);
2: $scope.edit.userdob = userData.dob; до того, как я столкнулся с ошибкой выше, я сразу создал объект и назначил его области редактирования, и проблема была решена.
Ответ 7
если дата уменьшается на 1 день, используйте этот код,
new Date(moment.utc(value).format('l LT'))
Ответ 8
Если вам нужно обновить все даты в массиве с помощью объектов
var data = [
{ id: "1" , birthday: "2016-01-20T11:24:20.882Z"},
{ id: "2" , birthday: "2016-01-20T11:24:20.882Z"},
{ id: "3" , birthday: "2016-01-20T11:24:20.882Z"},
];
function convertDataStingToObject (data) {
for(var i=0; i < data.length; i++ ){
console.log('string: ' + data[i].birthday);
data[i].birthday = new Date(data[i].birthday);
console.log('updated: ' + data[i].birthday);
console.log(typeof(data[i].birthday));
}
return data;
}
convertDataStingToObject(data);