2016-01-26 13 views
8

今日は、私は、このコードによるパフォーマンスの問題を修正しなければならなかった関数が呼び出され、何度(角度JS)

<div ng-repeat="entityNode in entityNode.group" ng-include="'entityGrouper'"></div> 

このコードをデバッグした後、この関数は配列サイズ(配列は4つのオブジェクトを持ち、関数は100回以上呼び出されました)よりもずっと多く呼び出されました。 テンプレートの中にng-initを置くだけで問題は解決しましたが、今は正常に動作していますが、なぜこの関数が何度も呼び出された理由は分かりませんでした。 2つの方法でデータをバインドする方法はありますか?

+0

同じテンプレートを再帰的に呼び出していますか?テンプレート内に '

'コールがあります – Developer

答えて

1

これは(入力を形成するために適用可能である)ので、結合双方向のデータではない出来事ではなく、なぜなら角度変化検出されます。 Angularは、テンプレートにバインドされている値のいずれかが変更されたかどうかを定期的にチェックし、変更されている場合は、ビューの値を更新します。通常は、ユーザーが生成したイベントによってトリガーされます。 updateStats(entityNode)の値が変更されたかどうかを確認するために、Angularがそれを評価します。これによりパフォーマンスが低下します。

これを修正するには、結果が一度設定され、今後変更されない場合は、先に言及したワンタイムバインディングupdateStats(entityNode)を使用することがあります。これはあなたのケースで、あなたはすでに評価をng-initに移しています。時間とともに更新される値については、entityNodeのような別のプロパティをentityNode.statsのように作成し、それをテンプレートに表示し、コントローラーまたはサービスで必要なときにのみ実行してください(updateStats(entityNode))。これにより、各ダイジェストサイクルでupdateStats(entityNode)を実行することはできません(既にどのくらいの頻度で表示されているかは分かります)。これによりアプリのパフォーマンスが向上します。

4

通常、このようなシナリオでは$watchを使用することをお勧めします。関数{{updateStats()}}をバインドしているので、ダイジェストサイクルごとに実行されます。

コードではダイジェストサイクルが呼び出されるたびに関数も呼び出されます。また、ダイジェストサイクルは頻繁にAngularの内部で呼ばれます。

+0

これは受け入れられる正解でなければなりません – thiagoh

2

あなたが見ているのは、ダイジェストサイクルの結果です。

::を追加すると、機能は1回/ 1回バインディングと呼ばれます。

{{ ::updateStats(entityNode) }}

+0

what :: exactly do? –

+1

'::'は1つの時間バインディングを提供します。この式に接頭辞を付けると、最初のダイジェスト後に実行または再計算が停止します。詳細情報* [documentation](https://docs.angularjs.org/guide/expression)のワンタイムバインド*セクション。 –

関連する問題