33

スコープで関数を定義しました。{{}} 内のビューから呼び出すと、X 回実行されます。

コントローラ

function testCtrl($scope) {
   $scope.myFunc = function(name) {
       return "Hello " + name;
   }
}

HTML

<div>{{myFunc('Joe')}}</div>

次の例で確認できます: http://jsfiddle.net/rbRvD/2/

またはプランカーを使用: http://plnkr.co/edit/LLQ7cKs2fEoBwv0C5XPE

これは間違った方法で行われていると思いますが、なぜ何度も実行されるのでしょうか?

4

3 に答える 3

36

関数は 10 回実行されます。なぜ10?なぜ100ではないのですか?

答えはドキュメントにあります:

ウォッチ リスナーがモデルを変更すると、他のリスナーが起動する可能性があります。これは、変更が検出されなくなるまでウォッチャーを再実行することによって実現されます。再実行の反復制限は、無限ループのデッドロックを防ぐために 10 です。

これが起こっているのを見ると、Angular がダイジェストを再実行してウォッチを再起動しなければならないような方法でモデルを変更していることを意味します。特定のケースでは、ページに表示されるカウンターを更新する関数を呼び出しています。カウンター値が変更されると、ダイジェストが再度実行され、カウンターなどを更新する関数が呼び出されます。

Angular は、ユーザーがモデルを変更し、ビューがそれらの変更に応答できるようにすることを期待しています (実際に推奨しています)。その逆ではありません。

于 2013-06-19T06:14:59.420 に答える
12

これは予期される動作です。角度式 ( ) は、各$digest ループ{{expression}}で再評価されます(ループごとに複数回行われる場合もあります)。これは、式が計算用語で軽いままであるべきであることを意味します。

さらに言えば、式の評価によって、AJAX 呼び出しやその他の集中的または非同期の操作が発生してはなりません。また、そうする必要がある場合でも、結果をキャッシュする必要があります。

于 2013-06-19T06:09:40.130 に答える
1

AngularJs は、レンダリング時にスコープのモデルを変更することをお勧めしません。スコープのモデルを変更する場合は、コントローラーまたはディレクティブで行います。

ビューは、データ (この場合はスコープ値) のみを表示する場所と考えてください。データのすべての変更は、コントローラーまたはディレクティブで行う必要があります。

于 2013-06-19T06:33:02.707 に答える