2

のような乗算関数がありcount() getTotal()ます。何かが変更された場合、これらすべての計算関数を実行する必要がありますcart/object。現在、私はのようなビューでそれらを使用しています{{count()}}。したがって、これらの関数はすべて複数回実行されています。これらの関数は、ダーティチェックのために複数回呼び出されると思います。これは正しいです?

今私は$watch関数について読みましたが、パフォーマンスの問題のため、それを避けるようにしてください。とにかく私はそれをテストしたいと思っていまし$watchedcart。ログに記録されるのは1 回だけであることがわかったので、そこにあるすべての計算関数を呼び出して、計算結果にバインドする$watch方が高速ではないでしょうか?cart

私はそれが同じ動作をするだろうと思っていたので、少し混乱しています。$watchもダイジェスト ループを通過するためです。

似たような質問がすでにたくさんあることは知っていますが、誰かが私のケースについてそれほど難しくない英語で直接説明してくれると、ずっと簡単になります.

例: パフォーマンスが優れているのはどれですか? なぜ?両方の亜種が消化サイクルを通過しますか? では、なぜバリアント 2 は 10 回ログに記録し、バリアント 1 は 1 回しかログに記録しないのでしょうか?

バリアント 1

// bind these to scope and show like {{totalGross}}
cartService.totalGross = null;
cartService.totalNet = null;
cartService.totalItems = null;
// watch the cart here and update all variables
$rootScope.$watch(function () {
    return cartService.cart;
}, function(){
    cartService.totalGross = cartService.getCartTotalGross();
    cartService.totalNet = cartService.getCartTotalNet();
    cartService.totalItems = cartService.getTotalItems();
}, true);

バリアント 2

// bind these to scope and show like {{getCartTotalGross()}}
cartService.getCartTotalGross();
cartService.getCartTotalNet();
cartService.getTotalItems();

私自身の質問に答えようとしていますが、それが正しいかどうかはわかりません。

バリアント 1では、もう 1 つのウォッチャーがありますが、関数の代わりに値を監視するだけで、カートを で手動で監視するため、もう 1 つ監視し$watchます。しかし、ウォッチャーの計算はそれほど重くありません。

バリアント 2関数が返す値を監視しているため、関数は同じ値を複数回計算する必要があり、魔女はより重いです。各ダイジェスト サイクルで UI が更新されます

これは正しいです?では、バリアント 1 の方がパフォーマンスが優れているのでしょうか?

4

1 に答える 1

3

$watch を使用するのは一般的に悪い習慣と考えられていますが、それはパフォーマンスの問題があるからではなく (だけでなく)、ほとんどの場合、より良い代替手段 (より明確で効率的な) があるためです。

たとえば、ユーザーが入力に何かを入力したときに変化するモデル値を監視する代わりに、この値に依存する何かを計算するために、入力で ng-change を使用し、そこから計算を呼び出すことができます。これはより高速であり、意図はより明確です。

さて、あなたの質問に答えるために:

イベントが angular によって処理されるたびに、イベント ハンドラーはスコープ内のすべてを変更できます。Angular には、何が変更されたかを知る方法がありません。したがって、たとえば、getTotalItems()イベント ハンドラーが何かを変更して、戻り値をgetTotalItems()変更する可能性があるため、呼び出す必要があります。

さらに、監視されている値を変更すると、ウォッチャー関数が実行され、このウォッチャー関数は、他のウォッチャーが監視できる他の値を変更することができます。ループ内で、最後の評価が前の評価と同じ結果になることが確実になるまで。これが、ダイジェスト ループと呼ばれるものです。

したがって、要するに、{{ getTotalItems() }}その関数が配列の長さやいくつかの値の合計などの単純なものを返すだけであれば、ビューに含めることは大したことではありません。しかし、人生の意味を計算する場合、それは本当に悪い考えです。代わりに、計算が必要な場合にのみ人生の意味を計算し、ビューに表示される変数に結果を格納する必要があります。

ウォッチャーでそれを行うことができますが、それは最後の手段です。すでに述べたように、多くの場合、より良い代替手段があります。

于 2016-04-01T20:35:38.483 に答える