2017-11-06 3 views
0

を更新:角度2定期的にそうように、私は)moment.js .fromNowを(使用してそれらの相対的な作成日付でアイテムのリストを表示していますビュー

getRelativeDate(date: string): string { 
    return moment(date, 'YYYY-MM-DD HH:mm:ss').fromNow(); 
} 

<div class="created">{{getRelativeDate(item.created)}}</div> 

そして、ここではそれが見えるものです次のように:

enter image description here 私は項目とやりとりしない限り、データが変更されていないため、現在の時刻は初期ロード後も変わりません。

これらの値を強制的にリフレッシュするにはどうすればよいですか?毎分で十分です。

+0

これはあなたの 'item'データが非同期であるかどうかに依存しますの

ライブ例 https://stackblitz.com/edit/angular-cli-moment-pipe

参考セット。データが非同期でない場合は、 'setInterval()'を 'ngOnInit()'に作成できます。データが非同期の場合、データを取得した後に 'setInterval()'を作成できます。 –

答えて

4

このためにパイプを作成することについて誰も驚いたことはありませんか?

import { Pipe, PipeTransform } from '@angular/core'; 

import moment from 'moment'; 

@Pipe({ 
    name: 'dateTimeFormat', 
    pure: false, 
}) 
export class DateTimeFormatPipe implements PipeTransform { 
    transform(date: string, format: string = 'YYYY-MM-DD HH:mm:ss'): string { 
    return moment(date, format).fromNow(); 
    } 
} 

これはロジックをパイプにオフロードすることでコンポーネントを清潔に保ちます。

<ul> 
    <li *ngFor="let date of dates"> 
    {{ date | dateTimeFormat:'YYYY-MM-DD HH:mm:ss'}} 
    </li> 
</ul> 

フォーマットはオプションであり、アプリケーション全体で再利用できます。

コンポーネントを定期的に更新するには、setIntervalを更新してください。 ChangeDetectorRefを呼び出し、ChangeDetectionStrategyに基づいてdetectChangesに電話する必要があります。さらに良いことに、コンポーネントは完全にdetachです。モーメントパイプ https://github.com/urish/angular2-moment/

+0

これは正しい答えです。私はそれを前に考えなかったとは信じられない! :D –

+0

'changeDetection:ChangeDetectionStrategy.OnPush'は、データ変更時に自動的にビューを更新しないことを意味しますか? 'detectChanges()'を実行したときだけですか? – abfarid

+1

'@Input()'バインディングの変更が検出されたときにのみビューを更新します。私のサンプルコンポーネントに@Input()バインディングがないので、コンポーネントが更新されるのは、手動で 'detectChanges'を呼び出すときだけです。より良いアプローチは、コンポーネントを完全に取り外すことです。これは、 'setInterval'が起動するたびにアプリケーション全体が変更をチェックしないようにします。私は答えによって更新しました。 – cgatian

0

setIntervalに移動してください。

これを行うにはChangeDetectorRefが必要です。

import {OnInit, OnDestroy, ChangeDetectorRef} from '@angular/core'; 

export class Listcomponent implements OnInit, OnDestroy { 

    intervalHolder: any; 

    constructor(private _changeDetectorRef: ChangeDetectorRef) { 
    } 

    ngOnInit(): void { 
    this.intervalHolder = setInterval(() => { 
     // Let's refresh the list. 
     this._changeDetectorRef.markForCheck(); 
    }, 1000 * 60); // 1 minute 
    } 

    ngOnDestroy(): void { 
     clearInterval(this.intervalHolder); 
    } 
} 
0

あなたのデータはあなたのngOnInit()setInterval()を作成し、ngOnDestroy()それをクリアすることができます非同期されていない場合。あなたの作成した日付がキーcreateditemsという名前の配列に格納されていると仮定すると:

component.ts

myFromNowInterval: any; 
myFromNow = Array(this.items.length).fill(''); 

ngOnInit() { 
    this.myFromNowInterval = setInterval(() => { 
    this.items.forEach((item, index) => this.myFromNow[index] = this.getRelativeDate(item)) 
    }, 60000); 
} 

ngOnDestroy() { 
    clearInterval(this.myFromNowInterval); 
} 

component.html

<div *ngFor="item of items; let i = index;"> 
    <div class="created">{{ myFromNow[i] }}</div> 
</div> 

これはmyFromNow配列毎分更新されます新しい配列のインデックスをDOMに揃えます。

0

変更検出をトリガーするには、コンポーネントに観測可能な間隔を置くだけで十分だと思います。トリガなしでこの

<span>{{ now() }}</span> 

now() { 
    const now: any = new Date(); 
    return (now - this.start) 
} 

triggerCD$; 

ngOnInit() { 
    this.triggerCD$ = Observable.interval(60000) 
} 

テスト、表示は変わりません。
トリガーを使用すると、テンプレート上でnow()が更新されます(ただし、トリガーへの直接リンクはありません)。

関連する問題