2014-01-06 11 views
10

私は、複雑なオブジェクトモデル全体に​​わたって、アカウンティングタイプの計算(収益、費用、利益など)の大きなセットを実行するAngular.jsアプリケーションを持っています。オブジェクトモデルの任意の部分を変更するには、すべての計算を再実行する必要があります。さらに、オブジェクトモデルへの変更の多くは、バインディングを使用してテンプレートから直接作成することができます。コントローラを中間体にする必要はありません。Angular.jsダイジェストサイクルが開始(または終了)するタイミングを知る方法を教えてください。

多くの計算結果をユーザに表示する必要があります。およびは、下流計算に役立ちます。たとえば、収益はユーザーに表示されますが、収益(ユーザーにも表示されます)を計算するためにも使用されます。しかし、各ダイジェストサイクルで2回の収入計算(複雑な計算)は必要ありません。そのため、最初に計算されたときにメモをとり、サイクルの間このメモに記録された値を再利用するのが最適です。

問題は、ダイジェストサイクルの開始時または終了時にこれらのメモをクリアする必要があることです。 1つのアプローチは、コントローラが、計算を進める前に、可能なすべての変化の原因を傍受し、手動でオブジェクトモデルをアンメソイズすることです。代わりに、私はずっと設定されているバインディングを使い続けたいと思っています。

私が知る限り、ダイジェストサイクルが開始されているか、終了したかを知る方法が必要です。この通知を受けると、私はメモをリセットすることができます。

Angular $watch documentationは言う:

あなたは$ダイジェストが呼ばれるたびに通知を受けたい場合は、あなたがいないリスナーにwatchExpression関数を登録 することができます。 ( watchExpressionが 変更が検出されたときにサイクルを消化$ごとに複数回実行することができますので、あなたのリスナーへの複数の呼び出しのために準備すること。)の各反復にmemoizationsをクリアするため

これは私に何を使用していませんダイジェストサイクルは最初にそれらを持つという目的を破るでしょう。私はただダイジェストサイクルごとに通知する必要があります。

これを行うにはどうすればよいですか、または問題を解決する別の方法がありますか?

+0

_ "これらのメモをクリアする必要があります..." - なぜですか? – Stewie

+0

'問題を解決するための代替アプローチがありますか...実際の問題が何であるかはっきりしていません – charlietfl

+0

このコストなどを計算するサービスを作成し、手動で計算メソッドを呼び出すとどうなりますか? –

答えて

9

OK、私は最終的に何かを考え出したと思うので、私自身の質問に答えると思った。

$$postDigestと呼ばれるプライベートな角度のメソッドがあり、次のダイジェストサイクルの終了後に関数をコールバックします。しかし、それは一度だけ実行されます。再帰的に再スケジュールするようにしようとすると、無限ループに入ります。

これを回避するには、代わりに$$postDigestを通常の$watchと組み合わせて使用​​できます。あなたは、コントローラは、後のサイクルごとにダイジェスト呼び出したいfnと呼ばれる機能を持っている場合は、コントローラ機能に次のようなものを追加したい:

... 
var hasRegistered = false; 
$scope.$watch(function() { 
    if (hasRegistered) return; 
    hasRegistered = true 
    // Note that we're using a private Angular method here (for now) 
    $scope.$$postDigest(function() { 
    hasRegistered = false; 
    fn(); 
    }); 
}); 
... 

これはa code fragment by Karl Seamonに基づいています。明らかに、$scopeでプライベートメソッドを呼び出すことは理想的ではありません。うまくいけば、これらの行に沿って$postDigestWatchメソッドが最終的にAngularに追加されることがあります。

なぜこのようなことをしたいのかという私の元の質問に対するコメントには混乱があります。まだわからない場合は、特定のユースケースをカバーするthis blog post I wroteを調べてください。

関連する問題