2017-03-08 397 views
0

第一個自定義angular2日期格式管,這是我想達到什麼:使用翻譯

比方說,我有一個包含js的Date對象發佈的模型。現在,我想以自定義的,人類可讀的格式呈現日期,該格式不顯示日期和時間,而是從現在開始的偏移(即「剛纔」,「大約一小時前」,「大約兩個小時前」 「等)。

我是新來的兩個,打字稿及angular2,但是從我至今讀,最優雅的方法是使用自定義的管道像:

@Pipe({name: 'hrTime'}) 
export class HrTimePipe implements PipeTransform { 

    constructor(private translate: TranslateService) { 

    } 

    transform(val: Date): string { 

     // Roughly check if that date is about one hour ago 
     let now: Date = new Date(); 
     now.setMinutes(now.getMinutes() - 90); 
     if (val > now) { 
      return this.translate.instant("about_1_h_ago"); 
     } 
    } 
} 

這種方法的問題是, TranslateService的instant()方法不能確保在構建或使用此管道時加載翻譯文件。因此,我的自定義管道當前只是返回我的翻譯密鑰(因爲instant()未找到我的翻譯)。

對於較大的時間間隔(即超過一天前),我的管道應該在內部使用日期格式管道,因此返回一個必須管道化到translate的翻譯密鑰並不是真正的選擇。

你有什麼建議嗎?使用自定義管道是我想要完成的正確方法?

謝謝!

+0

您可以使用APP_INITIALIZER opaque標記來提供翻譯在應用程序啓動。看看[this](https://gist.github.com/M4R1KU/20359bd6bebfe0a9b0107d82ed729fbc)。 – M4R1KU

回答

0

你可以把它變成不純的管道並返回一個Observable。這樣,您可以將管道連接到async管道,並使其無縫工作。

這樣,你就會有三種情況,我認爲: - 在timegap大:與日期解決立即 - 的timegap小,翻譯已經被加載:翻譯並立即解決 - 的timegap是小和翻譯尚未準備好:等待翻譯文件加載,然後解決與正確的翻譯

+0

我也會嘗試這種方法,但據我瞭解,出於性能方面的原因,應該避免使用不純管道(特別是在發佈內容列表中)? –

+0

是的,可能會更頻繁地調用不純管道(每個組件更改檢測),因此性能影響的可能性更大。您將不得不評估轉換的重要程度以及平均調用次數。我不會在默認情況下避免它,不要忽略你的工具... – alebianco