2016-06-22 15 views
0

Ich habe eine Reihe von .net webApi-Aktionen, die in JSON deserialisierte Daten zurückgeben. Meine eckige Anwendung verwendet dann diese Datumszeichenfolgen für die Anzeige \ edit oder als ngModel in einer Vielzahl von date-Anweisungen. Viele dieser Direktiven erfordern ein JavaScript-Datumsobjekt und keine Zeichenfolgedarstellung eines Datums. Wie wird die Datumszeichenfolge für alle zurückgegebenen Webapi-Daten in das JavaScript-Datum serialisiert?Wie konvertiere ich von webapi zurückgegebene Daten im string-Format in das Javascript-Datumsformat für AngularJs

N.B. Ich habe eine Vielzahl von RegExs ausprobiert, die dem ISO-8601-Standard entsprechen, aber für jeden, den ich verwende, gibt es eine Reihe von Anwendungsfällen, die fehlschlagen. Die Fälle, die ich benötige, sind wie folgt:

  1. sollte keine Daten (string) z. 'http://blah/'
  2. sollte nicht Daten (Ganzzahl) z. 2015
  3. sollte schlechte Daten nicht konvertieren, z. '2009-05-19T14a39r'
  4. sollte nicht teilweise falsches Datum von Zeichenfolge in Datum z. '1'
  5. sollte keine Zeichenfolge konvertieren, die wie ein Jahr aussieht, z. '2015'
  6. sollte Datum von Zeichenfolge in Datum z. "2015-09-09"
  7. sollte Datum mit der Zeit von Zeichenfolge zu Datum mit der Zeit konvertieren, z. '2009-05-19T14: 39'
  8. sollte Datum mit der Zeit von Zeichenfolge zu Datum mit Uhrzeit einschließlich Sekunden konvertieren, z. '2009-05-19T14: 39: 23'

  9. sollte das Datum mit der Zeit in die Millisekunde von String zu Datum mit der Zeit mit Millisekunden, z. '2016-06-09T13: 02: 39.957'

  10. sollte Datum mit der Zeit von Zeichenfolge zu Datum mit der Zeit in UTC konvertieren, z. '2009-05-19T14: 39Z'

  11. sollte kein Datum konvertieren, das Teil einer längeren Zeichenfolge ist, z. ‚Sollte nicht konvertieren 2015-12-12T00: 00: 00Z, da dies Teil einer längeren Zeichenkette‘

Antwort

1

Also, erstens, um alle Zeichenfolge Daten nicht JavaScript Daten abzufangen und konvertieren wir brauchen Winkel zu tun die Abhören und Ersetzen. Dazu können wir einen Interceptor auf dem httpProvider verwenden, um sicherzustellen, dass unser Code auf allen zurückgegebenen HTTP-Antworten ausgeführt wird, bevor ein anderer Code ausgeführt wird.

var app = angular.module('app'); 

app.config(configureProviders); 

configureProviders.$inject = ['$httpProvider']; 
function configureProviders($httpProvider) { 
    configureHttp($httpProvider); 
} 

function configureHttp(httpProvider) { 
    // add all http interceptors 
    httpProvider.interceptors.push('dateDeserialiserInterceptor'); 
} 

ok so jetzt haben wir unsere Abfangjäger registriert, aber wir müssen einen Code, damit es funktioniert:

(function() { 
    var module = angular.module('myApp.interceptors'); 

    module.factory('dateDeserialiserInterceptor', function() { 

     function convertDateStringsToDates(input) { 
      // Ignore things that aren't objects. 
      if (typeof input !== "object") return input; 

      for (var key in input) { 
       if (!input.hasOwnProperty(key)) continue; 

       var value = input[key]; 
       // Check for string properties which look like dates. 
       if (typeof value === "string" && (moment(value, moment.ISO_8601).isValid())) { 
        input[key] = moment(value, moment.ISO_8601).toDate(); 
       } else if (typeof value === "object") { 
        // Recurse into object 
        convertDateStringsToDates(value); 
       } 
      } 
     }; 

     return { 
      response: function (response) { 
       convertDateStringsToDates(response); 
       return response; 
      } 
     }; 
    }); 
})(); 

So ist der obige Code wurde ursprünglich im Internet irgendwo genommen und hatten einen manuellen REGEX Vergleich . Die RegEx wurde als ISO 8601 konform beschrieben, aber ich fand eine Vielzahl von Beispielen, wo dies nicht der Fall war. Dies basiert nun auf einem Open Source library momentJs um festzustellen, ob das Datum ISO 8601 konform ist und die Konvertierung durchzuführen. Wenn das Datum nicht konform ist, wird der Zeichenfolgenwert einfach zurückgegeben. ISO 8601 ist ein großer Standard zu verwenden (da es eine Vielzahl von Fällen abdeckt) und ist viel besser als hart codieren irgendein erwartetes bestimmtes Format, das Sie auf den Pfad von "oh ... es ist verpasst" führen kann.

Momentan werden alle zurückgegebenen Antwortobjektwerte für potenzielle Daten analysiert. Ich habe darüber nachgedacht, dies zu verbessern, indem ich die Anfrage explizit mit den Antworteigenschaften markiere, von denen wir erwarten, dass sie Daten sind.Auf diese Weise müssten wir nicht alles \ versuchen (was langsam ist) und auch das Risiko eingehen, dass etwas, das wir nicht konvertieren wollen, konvertiert wird. Allerdings ist dieser Ansatz ein wenig unordentlich und würde viele Anfragen verstreuen. Ich mag diesen Ansatz für jetzt und es scheint zu funktionieren. Freut mich, dass es verbessert wird!