2017-07-20 22 views
2

dataListを表示したい。いくつかの値は関数から計算されます。これは、angular2がcalculate関数を何度も呼び出すようです。関数が複数回呼び出される

<tr *ngFor="let data of dataList"> 
    <td>{{ data.no }}</td> 
    <td>{{ data.name }}</td> 
    <td>{{ calculateFunction(data.price) }}</td> 
    </tr> 

コンソールは、 "calculate ..."というメッセージを何度も出力します。

calculateFunction() { 
    console.log('calculate...'); 
    return ...; 
} 

私はパフォーマンスに関して心配する必要がありますか、それともangular2にこれを行わせてください。

+2

おそらく、モデルの変更を引き起こしているものがあります。これによって、すべての要素の関数が再び実行されます。それが軽量関数であれば大したことではなく、もっと複雑なものであれば、おそらくコンポーネントの内部でそれを処理する方が良いでしょう。 –

+0

@ JohnMontgomeryトリガーモデルを変更するのは1つだけです。 dataListはinitステートでは定義されておらず、要求が終了するとhttpの結果をdataListに代入します。 – user7395677

答えて

2

caculateFunction(data.price)関数は、(正確にはngForで作成された埋め込みビューの)コンポーネントの角度の変化検出を検出するたびに呼び出されます。これは、DOMの更新が変更検出の一部であり、AngularがcaculateFunctionを呼び出してDOM更新に使用する値を知る必要があるためです。そして、変化の検出サイクルはかなり頻繁に実行することができます。したがって、リストに3つのアイテムがあり、CDが最初に3回トリガーされた場合、その関数は9回呼び出されます。

あなたはupdateRenderer機能を調べる場合は、これらの線に沿って何かを参照してくださいshoul:

function(_ck,_v) { 
    var _co = _v.component; 
    var currVal_0 = _co.calculateFunction(_v.context.$implicit); 
    _ck(_v,3,0,currVal_0); 
    } 

The mechanics of DOM updates in Angularでどの角度アップデートのDOMについてお読みください。

私はパフォーマンスに関して心配する必要がありますか?あるいは、angular2には がありますか?

calculateFunction(data.price)同じ価格で同じ結果が返された場合は、各アイテムについてこれらの値を事前に計算し、それらをテンプレートにレンダリングする方がよいでしょう。

<td>{{ data.no }}</td> 
<td>{{ data.name }}</td> 
<td>{{ data.calculatePrice) }}</t 

こうすることで、パフォーマンスの低下を回避できます。

関連する問題