作为一项要求,我必须根据模拟数据分析几个 AngularJS 组件(例如 ng-grid、IE8、Chrome 和 FF 中的数据表)的性能基准。我有模拟数据。
现在,当使用 IE8 Profiler 时,我得到了几个函数的时间(毫秒)。根据 AngularJS 调用结构,应该$digest
时间(包含时间,根据 IE8 分析器)反映页面的加载时间,或$digest
& $apply
?我是 AngularJS 的新手,所以对这些概念的解释会很好!
请注意,调用 $apply 将触发 $rootScope 上的 $digest,这意味着 $digesting 所有子作用域。
$apply 函数本身相对较轻(您可以在角度源中检查它)。在 $digest 期间评估观察者和比较值(脏检查)的过程可能会变得昂贵。因此,迄今为止的性能测试一直集中在测量 $digests 上。一些例子:
AngularJS 中的数据绑定如何工作? https://stackoverflow.com/questions/9682092/databinding-in-angularjs/9693933#9693933(见米斯科的回答)
如何衡量 AngularJS 应用程序摘要周期的性能? https://stackoverflow.com/questions/23066422/how-do-i-measure-the-performance-of-my-angularjs-apps-digest-cycle
http://blog.scalyr.com/2013/10/angularjs-1200ms-to-35ms/ http://blog.scalyr.com/2013/10/angularjs-1200ms-to-35ms/
这是对 $apply 和 $digest 之间差异的很好解释:http://www.sitepoint.com/understanding-angulars-apply-digest/ http://www.sitepoint.com/understanding-angulars-apply-digest/。相关摘录:
$digest:
$digest 循环是通过调用 $scope.$digest() 开始的。假设您通过 ng-click 指令更改处理函数中的作用域模型。在这种情况下,AngularJS 通过调用 $digest() 自动触发 $digest 循环。当 $digest 周期开始时,它会触发每个观察者。这些观察者检查示波器模型的当前值是否与上次计算的值不同。如果是,则执行相应的监听函数。因此,如果视图中有任何表达式,它们将被更新。除了 ng-click 之外,还有其他几个内置指令/服务可以让您更改模型(例如 ng-model、$timeout 等)并自动触发 $digest 周期。
$apply:
AngularJS ...将仅考虑在 AngularJS 上下文中完成的那些模型更改(即更改模型的代码包装在 $apply() 内)。 Angular 的内置指令已经做到了这一点,因此您所做的任何模型更改都会反映在视图中。但是,如果您更改 Angular 上下文之外的任何模型,则需要通过手动调用 $apply() 来通知 Angular 更改。这就像告诉 Angular 你正在更改一些模型,它应该触发观察者,以便你的更改正确传播。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)