Подтвердить что ты не робот

Ошибка: [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...

4b9b3361

Ответ 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);