angularjs – 如何知道Angular.js摘要循环何时开始(或整理)?

前端之家收集整理的这篇文章主要介绍了angularjs – 如何知道Angular.js摘要循环何时开始(或整理)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个Angular.js应用程序,在一个复杂的对象模型中执行大量的会计类型计算(收入,成本,利润等).对对象模型的任何部分的更改都需要重新执行所有计算.此外,对象模型的许多更改可以使用绑定直接从我的模板进行 – 无需控制器进行中间化.

许多计算结果都需要显示用户并对下游计算做出贡献.例如,收入显示用户,但也用于计算利润(也显示用户).然而,在每个摘要循环中计算收入两次没有意义(这是一个复杂的计算),因此明显的优化是在首次计算时记录,然后在循环持续时间内重用此记忆值.

问题是我需要在摘要循环的开始或结束时清除这些记忆.一种方法是控制器在进行计算之前拦截每一个可能的变化源并手动取消对象模型的清除.相反,我更愿意继续使用已经设置的绑定.

据我所知,我需要的是一种知道摘要循环何时开始或何时完成的方法.当我收到此通知时,我可以重置记事本.

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,以涵盖我的具体用例.

猜你在找的Angularjs相关文章