2016-03-29 19 views
1

Ich habe gerade versucht, ein einfaches date Rohr in meinem angular2 App zu verwenden:Angular2 DatePipe Verarbeitung ISO 8601 Datum (ungültiges Argument '*' für Pipe 'DatePipe')?

Registered: {{user.registered | date:'shortDate'}} 

Der Fehler, den ich bekommen ist:

Invalid argument '2016-03-28T07:25:40.824Z' for pipe 'DatePipe' in [{{user && user.registered | date:'shortDate' }} in [email protected]:57] 

Ich habe eine User-Modell (minimal hier) Geteilt zwischen dieser Komponente und einigen anderen:

export class User { public registered: Date; } 

Ich bekomme die Benutzerdaten als JSON vom Backend, und es ist ein ISO 8601: 2016-03-28T07:26:01.202Z.

Wenn ich mein eigenes benutzerdefiniertes Rohr verwende, funktioniert es (Beispiel unten).

import {Pipe, PipeTransform} from 'angular2/core'; 
/** 
* The default ISO Date is not parseable by ts compiler or some such. 
*/ 
@Pipe({ name: 'betterDate' }) 
export class BetterDatePipe implements PipeTransform { 

    transform(date: number): string { 

    let d = new Date(date); 
    return d.toLocaleDateString(); 
    } 
} 

Der Name, BessereDatePipe ist offensichtlich ein Wortspiel auf mich besser angular2 Code zu schreiben dann die Erfinder;)

Antwort

1

Das Argument offensichtlich ein string, kein Date. Sie müssen es in Date konvertieren, bevor Sie es an die Leitung übergeben. JSON unterstützt den Typ Date nicht.

user.registered = new Date(json.registered); 

oder ähnlich, je nachdem, wie Sie das Benutzerobjekt erhalten.

Siehe auch Converting string to date in js

+0

Hmm. Wohin soll das gehen, im Konstruktor der User-Klasse oder so? Ich bekomme eine Reihe von Benutzern von json (angular2/http, dann ' response.json()' - so weiß ich nicht, was genau zu tun, um diese zu konvertieren. – Zlatko

+1

Siehe hier http://StackOverflow.com/Questions/ 36868856/asp-net-webapi-datetimeoffset-serialize-zu-json-javascript-angular2 – iwhp

1

Statt Neuimplementierung des Rohres, können Sie einen Vermittler ein schreiben, den String-Wert in Datum der Komponente Transformation zuerst:

String-to-date.pipe.ts:

import {Pipe, PipeTransform} from '@angular/core'; 
/** 
* Pipe to transform a string to a date 
*/ 
@Pipe({name: 'stringToDate'}) 
export class StringToDatePipe implements PipeTransform { 
    /** 
    * Constructor 
    */ 
    constructor() { 
    } 
    /** 
    * Transform a date that is passed as string into a date 
    * @param value The date passed as string 
    * @returns {Date} The Date object 
    */ 
    transform(value: string): Date { 
     return new Date(value); 
    } 
} 

Komponente

import {StringToDatePipe} from './string-to-date.pipe'; 
@Component({ 
    ... 
    pipes: [StringToDatePipe], 
    ... 
}) 

Vorlage

Registered: {{user.registered | stringToDate | date:'shortDate'}} 
+0

Ein kleines bisschen sauberer, aber mit einem extra Rohr.Allerdings habe ich mich an meine Lösung gewöhnt und es funktioniert.Thanks für den Vorschlag obwohl Englisch: www.doc-o-matic.com/webhelp/Tdlg.html Die ursprüngliche Frage des eckigen Rohrs, das allein eine String - Darstellung des ISO 8601 Datums konsumieren kann, wird immer noch nicht beantwortet. – Zlatko

1

Ich sehe Verdienste in beide, aber der Code des OP etwas zu beschränken: es gibt immer das gleiche Datumsformat der ganze Zeit, sie ist schließlich ein anderes Rohr gehen zu schreiben, das zu ändern Format trotzdem.

Die zweite Methode klingt sehr viel überschaubarer: Allerdings, ein paar Dinge, die Pipes ist nicht etwas, das Sie in der @Component enthalten, müssten Sie verweisen, dass in der app.module.ts sowohl ein Import-Anweisung:

import { StringToDatePipe } from './???/string-to-date.pipe'

sowie um es in der @NGModule aufzunehmen ({... weiter unten auf der Seite unter Erklärungen.

Von dort können Sie das Custom Rohr, verwenden und dann bewegen auf mit Angular's Date Pipe