许多计算结果都需要显示给用户并对下游计算做出贡献.例如,收入显示给用户,但也用于计算利润(也显示给用户).然而,在每个摘要循环中计算收入两次没有意义(这是一个复杂的计算),因此明显的优化是在首次计算时记录,然后在循环持续时间内重用此记忆值.
问题是我需要在摘要循环的开始或结束时清除这些记忆.一种方法是控制器在进行计算之前拦截每一个可能的变化源并手动取消对象模型的清除.相反,我更愿意继续使用已经设置的绑定.
据我所知,我需要的是一种知道摘要循环何时开始或何时完成的方法.当我收到此通知时,我可以重置记事本.
Angular $watch documentation说:
If you want to be notified whenever $digest is called,you can
register a watchExpression function with no listener. (Since
watchExpression can execute multiple times per $digest cycle when a
change is detected,be prepared for multiple calls to your listener.)
有一个名为$$postDigest的私有Angular方法将在下一个摘要循环结束后回调一个函数.但是,它只运行一次,如果你尝试让它重新计划自己的递归,它将进入一个无限循环.
要解决这个问题,您可以将$$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.显然,在$范围内调用私有方法并不理想.希望这样一个$postDigestWatch方法可能最终被添加到Angular.
对于我原来的问题,对于您为什么要做这样的事情,有一些混淆:如果您还不清楚,请查看this blog post I wrote,以涵盖我的具体用例.