$ scope。$ apply会降低性能

时间:2015-04-23 07:27:57

标签: javascript asp.net angularjs angularjs-scope signalr.client

我有一个使用AngularJS的单页应用程序,我面临一个性能问题。我的应用程序处理来自服务器端的传入事件,这些事件使用ASP.NET SignalR传递到客户端的AngularJS框架。我的应用程序可以接收数百万个事件,服务器端没有性能问题,它可以轻松地将这些数量的事件一个接一个地传递给AngularJS框架。问题出在客户端。处理完事件后,我使用$ scope。$ apply()来更新页面并显示事件。在这种情况下,一个接一个地接收多个事件,每次调用$ scope。$ apply()都会减慢应用程序的速度并且不会快速显示事件。这些事件将随机传递,所以我甚至不知道我的申请在任何时间点会收到任何事件。

有关如何解决此问题的任何想法都会非常有用。

感谢。

1 个答案:

答案 0 :(得分:4)

而不是使用$scope.$apply(),而是使用$scope.$evalAsync()

来自文档:

  

稍后在当前范围内执行表达式。

     

$evalAsync无法保证expression的时间   执行,只有:

     
      
  • 它将在安排评估的功能之后执行   (最好在DOM渲染之前)。
  •   
  • 至少有一个$digest周期   执行expression后执行。
  •   
     

来自的任何例外   表达式的执行被转发到$exceptionHandler   服务。

     

注意:如果在$digest周期之外调用此函数,则为新函数   将安排$digest周期。但是,总是鼓励它   调用代码,用于在$apply调用中更改模型。那   包括通过$evalAsync评估的代码。

我也倾向于使用$scope.$safeApply()方法实际上是对$scope.$evalAsync()的去抖动。