作为一项要求,我必须分析几个AngularJS组件的性能基准,例如ng-grid,IE8中的数据表,Chrome和& FF对模拟数据。我有模拟数据。
现在使用IE8 Profiler时,我得到了几个功能的时间(ms)。根据AngularJS调用结构,$digest
时间(包含时间,根据IE8分析器)应反映页面的加载时间,或$digest
&的总和。 $apply
?我是AngularJS的新手,所以对这些概念的解释会很好!
答案 0 :(得分:2)
请注意,调用$ apply将触发$ rootScope上的$ digest,这意味着$ digest所有子范围。
$ apply函数本身相对较轻(您可以在角度源中检查它)。这是评估观察者并在$ digest期间比较值(脏检查)的过程,这可能会变得昂贵。因此,迄今为止的性能测试一直专注于测量$摘要。一些例子:
How does data binding work in AngularJS?(参见Misko的回答)
How Do I Measure the Performance of my AngularJS app's digest Cycle?
http://blog.scalyr.com/2013/10/angularjs-1200ms-to-35ms/
这是对$ apply和$ digest之间差异的一个很好的解释:http://www.sitepoint.com/understanding-angulars-apply-digest/。相关摘录:
$消化:
$ digest循环由于调用$ scope而开始。$ digest()。假设您通过ng-click指令更改处理函数中的范围模型。在这种情况下,AngularJS通过调用$ digest()自动触发$ digest循环。当$ digest周期开始时,它会触发每个观察者。这些观察者检查范围模型的当前值是否与上次计算的值不同。如果是,则执行相应的侦听器函数。因此,如果您在视图中有任何表达式,它们将被更新。除了ng-click之外,还有其他一些内置指令/服务可以让你更改模型(例如ng-model,$ timeout等)并自动触发$ digest循环。
$适用:
AngularJS ...将只考虑在AngularJS上下文中完成的那些模型更改(即更改模型的代码包含在$ apply()中)。 Angular的内置指令已经这样做,因此您所做的任何模型更改都会反映在视图中。但是,如果更改Angular上下文之外的任何模型,则需要通过手动调用$ apply()来通知Angular更改。这就像告诉Angular您正在更改某些模型,它应该激活观察者,以便您的更改正确传播。