我有一个Angular.js应用程序,它在复杂的对象模型中执行大量的会计类型计算(收入,成本,利润等).对对象模型的任何部分的更改都需要重新执行所有计算.此外,对象模型的许多更改都可以使用绑定直接从我的模板中进行 - 不需要控制器来中间.
许多计算结果都需要向用户显示并有助于下游计算.例如,收入显示给用户,但也用于计算利润(也显示给用户).但是,在每个摘要周期中计算收入两次(这是一个复杂的计算)是没有意义的,因此明显的优化是在首次计算时进行记忆,然后在周期的持续时间内重复使用该记忆值.
问题是我需要在摘要周期的开头或结尾清除这些记忆.一种方法是控制器拦截每个可能的变化源,并在继续计算之前手动取消对象模型.相反,我更喜欢继续使用已设置的绑定.
据我所知,我需要的是一种了解摘要周期何时开始或何时完成的方法.当我收到此通知时,我可以重置备忘录.
该角$表的文档说:
如果您希望在调用$ digest时收到通知,则可以注册一个没有监听器的watchExpression函数.(由于watchExpression可以在检测到更改时每$摘要周期执行多次,因此请准备多次调用您的侦听器.)
这对我没用,因为在摘要周期的每次迭代中清除memoizations会破坏首先使用它们的目的.每个摘要周期我只需要一个通知.
我该怎么做,还是有其他方法来解决问题?
Ben*_*ese 10
好吧,我想我终于搞清楚了,所以以为我会回答我自己的问题.
有一个私有的Angular方法被调用$$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();
});
});
...
Run Code Online (Sandbox Code Playgroud)
这是基于Karl Seamon的代码片段.显然,调用私有方法并不理想$scope.希望$postDigestWatch沿着这些方向的方法最终可能会被添加到Angular中.
关于你为什么要这样做的原始问题的评论中有一些混乱:如果你还不清楚,请查看我写的这篇博文,其中涵盖了我的特定用例.
| 归档时间: |
|
| 查看次数: |
4398 次 |
| 最近记录: |