2015-05-29 10 views
42

Sto lavorando a angular applicazione con Django con rest-framework ..Errore: [ngModel: datefmt] Previsto `2015-05-29T19: 06: 16.693209Z` di essere una data - angolare

L'applicazione riceve è informazioni con json dal server .. Uno dei tasti è created_time ... Il valore di questo campo è il formato in base a iso-8601, ad esempio 2015-05-29T19:06:16.693209Z.

Nel client Ho un campo:

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

Ma quando i dati sono in arrivo ottengo questo errore:

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) 

ho già provato di tutto :(il formato è esattamente come le istruzioni nei documenti angolari ...

risposta

66

Ciò deve accadere con angolare 1.3+ 1.3+ sui reparti ng-model per l'input di data/ora deve essere un oggetto data valido, rappresentazione stringa di d mangiato non è più permesso. È necessario convertire la stringa in oggetto data ($scope.created_time = new Date(dateString)) e collegarlo al modello ng. Se segui lo error link, hai una descrizione chiara dell'errore e come risolverlo.

All date-related inputs like require the model to be a Date object. If the model is something else, this error will be thrown. Angular does not set validation errors on the in this case as those errors are shown to the user, but the erroneous state was caused by incorrect application logic and not by the user.

+0

La ringrazio molto :) – Yehuda

+0

@Yehuda Sei il benvenuto !! – PSL

+0

funziona solo nel browser ora ma non su cordova – niklas

33

Se ottenere i dati da un servizio REST, si può semplicemente convertire i vostri campi per data.

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

Questo mi ha aiutato.Grazie :) – Sampath

+0

funziona bene anche in $ resource.save callback – jmaculate

-2

Se è necessario aggiornare tutte le date in Array con gli oggetti

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

new Date() restituisce sempre la data in base alle impostazioni locali dell'utente, quindi non un'opzione. Se ho salvato 08.33 sul server, voglio visualizzare 8.33 am, non qualsiasi GMT offset che l'utente è acceso – Mirko

14

Creare una semplice direttiva che converte il valore del modello:

HTML:

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

direttiva:

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

In aggiunta alla risposta di PSL. Ecco come sovrascrivere i requisiti angolari 1.3+ come oggetto 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; 
    } 
    }; 
}); 

Può essere utilizzato con AngularFire $ firebaseObject e funziona bene con $ bindTo vincolante a 3 vie. Non è necessario estendere il servizio $ firebaseObject. Funziona in applicazioni ioniche/cordova.

Working example on jsfiddle

Sulla base this answer

0

problema In realtà questo è problema formato della data, ho risolto questo problema utilizzando questo pezzo di codice. Soluzione: Sotto pezzo di codice risolverà questo problema:

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

dove it-it format = "Venerdì 1 febbraio 2013 06: 00 AM "Spero che questo aiuti gli altri a risolvere il problema, mi trovavo di fronte a un tale errore e mi sono risolto.

0

ho avuto questo errore e ho usato direttamente l'oggetto: sto inviando la strega soluzione che ho effettuato:
1: $ userData.dob = new Date (userData.dob); 2: $ scope.edit.userdob = userData.dob; prima di 1 ho affrontato l'errore precedente, quindi ho creato direttamente l'oggetto e l'ho assegnato all'ambito di modifica e il problema è stato risolto.

0

se la data di ottenere ridotto di 1 giorno, utilizzare questo codice,

new Date(moment.utc(value).format('l LT')) 
Problemi correlati