Altre risposte non funzionano in Angular 5?
Ho ricevuto un errore perché DatePipe non è un provider, quindi non può essere iniettato. Una soluzione è inserirla come provider nel modulo dell'app, ma la mia soluzione preferita è stata istanziarla.
Crea un'istanza dove necessario:
Ho guardato il codice sorgente di DatePipe per vedere come ha ottenuto la localizzazione: https://github.com/angular/angular/blob/5.2.5/packages/common/src/pipes/date_pipe.ts#L15-L174
Volevo usarlo all'interno di una pipe, quindi il mio esempio è all'interno di un'altra pipe:
import { Pipe, PipeTransform, Inject, LOCALE_ID } from '@angular/core';
import { DatePipe } from '@angular/common';
@Pipe({
name: 'when',
})
export class WhenPipe implements PipeTransform {
static today = new Date((new Date).toDateString().split(' ').slice(1).join(' '));
datePipe: DatePipe;
constructor(@Inject(LOCALE_ID) private locale: string) {
this.datePipe = new DatePipe(locale);
}
transform(value: string | Date): string {
if (typeof(value) === 'string')
value = new Date(value);
return this.datePipe.transform(value, value < WhenPipe.today ? 'MMM d': 'shortTime')
}
}
La chiave qui è importare Inject e LOCALE_ID dal core di angular, quindi iniettarlo in modo da poterlo dare al DatePipe per istanziarlo correttamente.
Trasforma DatePipe in un provider
Nel modulo dell'app puoi anche aggiungere DatePipe all'array dei tuoi provider in questo modo:
import { DatePipe } from '@angular/common';
@NgModule({
providers: [
DatePipe
]
})
Ora puoi semplicemente iniettarlo nel tuo costruttore dove necessario (come nella risposta di cexbrayat).
Sommario:
Entrambe le soluzioni hanno funzionato, non so quale angolare considererebbe la maggior parte "corretta", ma ho scelto di crearne un'istanza manualmente poiché angular non ha fornito datepipe come provider stesso.