it-swarm.com.de

Fehler: [ngModel: datefmt] Voraussichtliches Datum: 2015-05-29T19: 06: 16.693209Z` als Datum - Angular

Ich arbeite an angularapplication mit Django mit rest-framework ..

Die App erhält ihre Informationen mit json vom Server. Einer der Schlüssel ist created_time... Der Wert dieses Feldes ist gemäß iso-8601 formatiert, beispielsweise 2015-05-29T19:06:16.693209Z.

Im Client habe ich ein Feld: 

<input type="time" ng-model="created_time">

Wenn die Daten ankommen, erhalte ich diesen Fehler: 

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)

Ich habe schon alles probiert :( das format entspricht genau den anweisungen in den docs von angle ...

51
Yehuda

Dies muss mit dem Winkel 1.3+ geschehen. 1.3 auf den Stationen ng-model für Datum/Uhrzeit muss ein gültiges Datumsobjekt sein, eine String-Darstellung des Datums ist nicht mehr zulässig. Sie müssen den String in ein Date-Objekt ($scope.created_time = new Date(dateString)) konvertieren und an das ng-model binden. Wenn Sie dem error-Link folgen, wird eine klare Beschreibung des Fehlers und der Fehlerbehebung angezeigt.

Für alle datumsbezogenen Eingaben ist es erforderlich, dass das Modell ein Date-Objekt ist. Wenn das Modell etwas anderes ist, wird dieser Fehler ausgegeben. In diesem Fall setzt Angular keine Validierungsfehler, da diese Fehler dem Benutzer angezeigt werden. Der fehlerhafte Status wurde jedoch durch falsche Anwendungslogik und nicht durch den Benutzer verursacht.

78
PSL

Wenn Sie Ihre Daten von einem REST - Dienst erhalten, können Sie Ihre Felder einfach in Date konvertieren.

$http.get(url).success(function(data){
     $scope.data = data; // get row data
     $scope.data.mydatefield = new Date($scope.data.mydatefield); // convert filed to date
});
34

Erstellen Sie eine einfache Direktive, die den Modellwert konvertiert: 

HTML: 

<input date-input type="time" ng-model="created_time">

Richtlinie:

app.directive('dateInput', function(){
    return {
        restrict : 'A',
        scope : {
            ngModel : '='
        },
        link: function (scope) {
            if (scope.ngModel) scope.ngModel = new Date(scope.ngModel);
        }
    }
});

Zusätzlich zur Antwort von PSL ..__: So können Sie die Anforderungen von Winkel 1.3 und höher als Date-Objekt überschreiben.

<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;
    }
  };
});

Es kann mit AngularFire $ firebaseObject verwendet werden und funktioniert gut mit der $ bindTo 3-Wege-Bindung. $ FirebaseObject-Dienst muss nicht erweitert werden. Es funktioniert in Ionic/Cordova-Anwendungen.

Arbeitsbeispiel zu jsfiddle

Basierend auf dieser Antwort

8
Andrey Klochkov

wenn das Datum um 1 Tag reduziert wird, verwenden Sie diesen Code

new Date(moment.utc(value).format('l LT'))
0
Sameera

Ich hatte diesen Fehler und habe das Objekt direkt verwendet: Ich poste die Lösung, die ich durchgeführt habe:
1: $ userData.dob = neues Datum (userData.dob); 2: $ scope.edit.userdob = userData.dob; Bevor ich vor dem Fehler stand, habe ich das Objekt direkt erstellt und dem Bearbeitungsbereich zugewiesen, und das Problem wurde gelöst.

0
Eknath Kulkarni

Problem Eigentlich handelt es sich um ein Datumsformat-Problem. Ich habe dieses Problem mit diesem Code gelöst Lösung: Das folgende Code-Stück löst dieses Problem:

            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);

wo en-us format = "Freitag, 1. Februar 2013, 06: 00 Uhr", hoffe, dass dies anderen helfen wird, ein Problem zu lösen.

0
Usman