2017-02-06 8 views
1

*ngFor内のクラスのスナップショットを取得してローカル変数に時間/状態/人化値を保存するにはどうすればよいですか?例えばngForの内部でローカル変数を作成する方法

timer.remaining = timer.expires - Date.now()

<ion-card class="timer" *ngFor="let timer of timers"> 
    <ion-card-content> 
    <ion-card-title>{{timer.humanize(timer.remaining) }}</ion-card-title> 
    <div class="card-subtitle">{{timer.label}}</div> 
    </ion-card-content> 
    <ion-note>remaining: {{timer.remaining/1000}}</ion-note> 
    <button ion-button block icon-left 
    [color]="lookup[timer.state].color" 
    (click)="timerClick(timer)" 
    > 
    <ion-icon [name]="lookup[timer.state].icon" ></ion-icon> 
    {{timer.label}} 
    </button> 
</ion-card> 

私はすべての表示プロパティを取得するためにngForの内側に一度だけtimer.snapshot()を呼びたいです。

ソリューション:

おかげで、私はその後、Timersを変換するためにパイプを使用するには、あなたがコンポーネントクラスに*ngForで使用する値の配列を作成する必要があります*ngFor

// Pipe 
@Pipe({name: 'toJSON', pure: false}) 
export class ToJsonPipe implements PipeTransform { 
    transform(value: any| Array<any>): any | Array<any> { 
    let unwrap = false; 
    if (!Array.isArray(value)) { 
     value = [value]; 
     unwrap = true; 
    } 
    const result = value.map((o)=>{ 
     if (o && o.toJSON) return o.toJSON(); 
     else return {}; 
    }) 
    return unwrap ? result[0] : result; 
    } 
} 



// html template 
<ion-card class="timer" *ngFor="let timer of timers | toJSON "> 
+0

これを行う最善の方法は、残りの時間を計算するパイプを作成することです。私は、他のすべてのアプローチはハックだと思う。 –

答えて

0

を通してそれをプッシュまたはサービスをしてから*ngForにロジックを入れずに*ngForを使用してバインドするだけです。 ハッキングがあるかもしれませんが、通常Angularsの変化の検出には問題があり、コンポーネントのパフォーマンスが大幅に低下します。

+0

私は上記のソリューションを使用し、それは作品の並べ替えです。しかし、SimpleChangeはpreviousValueを正しく格納していないので、常に '{}'です。それはPipeから匿名オブジェクトを返すことによって引き起こされるかもしれませんが、私は解決策を知らないのです。参照してください:http://stackoverflow.com/questions/42134483/angular2-simplechange-is-not-storing-previousvalue – michael

+0

私はあなたの質問で 'SimpleChange'について何も見つかりませんでした。 –

+0

この質問にはありませんが、オブジェクトの配列を作成する解決策は 'ngFor'問題を解決しますが、コンポーネントattrを' ngFor'テンプレート入力変数にバインドする際に別の問題が発生します。変更検出ループは、それをきれいに処理しません。 – michael

関連する問題