【问题标题】:$scope.$apply slows down performance$scope.$apply 会降低性能
【发布时间】:2015-07-01 05:32:32
【问题描述】:

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    来自文档:

    稍后在当前作用域上执行表达式。

    $evalAsync 不保证expression 将在何时 执行,仅此:

    • 它将在安排评估的函数之后执行 (最好在 DOM 渲染之前)。
    • 至少有一个$digest 循环将是 在expression 执行之后执行。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2021-12-05
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多