我有一个使用AngularJS的单页应用程序,我面临一个性能问题。我的应用程序处理来自服务器端的传入事件,这些事件使用ASP.NET SignalR传递到客户端的AngularJS框架。我的应用程序可以接收数百万个事件,服务器端没有性能问题,它可以轻松地将这些数量的事件一个接一个地传递给AngularJS框架。问题出在客户端。处理完事件后,我使用$ scope。$ apply()来更新页面并显示事件。在这种情况下,一个接一个地接收多个事件,每次调用$ scope。$ apply()都会减慢应用程序的速度并且不会快速显示事件。这些事件将随机传递,所以我甚至不知道我的申请在任何时间点会收到任何事件。
有关如何解决此问题的任何想法都会非常有用。
感谢。
答案 0 :(得分:4)
而不是使用$scope.$apply()
,而是使用$scope.$evalAsync()
。
来自文档:
稍后在当前范围内执行表达式。
$evalAsync
无法保证expression
的时间 执行,只有:
- 它将在安排评估的功能之后执行 (最好在DOM渲染之前)。
- 至少有一个
$digest
周期 执行expression
后执行。来自的任何例外 表达式的执行被转发到
$exceptionHandler
服务。注意:如果在
$digest
周期之外调用此函数,则为新函数 将安排$digest
周期。但是,总是鼓励它 调用代码,用于在$apply
调用中更改模型。那 包括通过$evalAsync
评估的代码。
我也倾向于使用$scope.$safeApply()
方法实际上是对$scope.$evalAsync()
的去抖动。