合并/延迟多个子范围$ apply call

时间:2014-10-10 10:13:17

标签: javascript angularjs angularjs-scope

在我的应用程序中,我通过HTTP通道接收数据,该通道以自定义方式处理。我正在从管道构建一些[data]对象,将它们包装在一个范围内。$ new(true)当我收到更新时调用childScope。$ apply()来设置新属性。

这适用于轻载,所有观察者都会收到通知,并且确实在没有任何问题或错过更新的情况下正常运行。

现在我正在尝试推送更多更新,并且不知道上面使用的模式是否可行。我认为(虽然没有检查)每次调用$ apply都会调用根作用域上的摘要,我想在浏览器周期或~50ms间隔内合并它们。目前,每当我收到5000个对象/范围的约100个更新时,它就会杀死浏览器。

我看到有角度的文档说每个范围都有一个$ applyAsync方法,但我无法在任何地方找到它,这基本上就是我所追求的。

这是一个坏主意,而且性能已经足够好了吗?我应该使用$ browser.defer()还是其他一些方法来实现我自己的applyAsync方法?

编辑:刚刚测试了代码,实际上是$ rootScope。$ digest是为每个子范围$ apply()调用的。也许将这部分从Angular JS移开并使用基于监听器的方法更好,所以这也是一个有效的答案。

1 个答案:

答案 0 :(得分:0)

最后我使用了evalAsync,这似乎按预期工作。

我可能需要经常调用$ digest(或$ apply)以确保没有未决的范围更改,但我还没有看到有必要这样做。

所以我的想法是:

  • 为需要快速发生的所有范围更改调用evalAsync
  • 在evalAsync调用之前递增计数器
  • 使用evalAsync函数参数中的当前时间设置变量并递减计数器
  • 在计时器上(50-100ms)查看计数器是否> 0并且上次评估时间是否是前一段时间(> 50-100ms),如果是,则强制使用摘要循环。

我不会将此标记为正确的答案,因为它似乎不是最好的主意,但它是我能想到的最好的,它可以按预期完成工作。