【发布时间】:2017-06-01 15:59:41
【问题描述】:
问题
虽然我的应用程序中的$digest-cycle 仍然运行得很快,但我注意到一些回调(例如通过ng-if 绑定在模板中)被调用的频率比我预期的要高。在单个 UI 交互中最多调用 100 次以上(我通常预计最多 3 到 10 次调用)。
我想了解为什么如此频繁地调用回调,并可能减少调用次数以防止将来出现性能问题。
我尝试了什么
根据我的理解,所描述的行为意味着$digest-cycle 最多需要数百个循环来删除所有脏标志并确保所有呈现的节点都是最新的。
我简化了几个回调,只返回 true - 而不是评估一些模型值 - 这对 $digest 调用的数量完全没有影响。我还检查了 Chrome-developer-Tools 中的 Performance-Tab,它只告诉我调用本身是在几毫秒内执行的。
为了排除故障,我还在整个应用程序中删除了几个 ng-repeat 块和 angular-filters,因为它们显然应用了几个要在 $digest 循环中评估的手表。这对回调函数的调用次数也没有影响。
因此我想我需要一个更复杂的工具或方法来调试整个应用程序中的(数量)$digest 调用,甚至找出所有这些调用的来源以及如何减少它们。
问题
我可以使用哪些工具和方法来评估我的角度应用程序中 $digest-loop 的性能(尤其是循环数)?
如何减少对绑定在模板中的回调的调用次数?
我认为要回答第二个问题,了解在这样的设置中可能导致对foo() 的额外调用已经很有帮助:
<div ng-if="ctrl.foo()">
<!--<span>content</span> -->
</div>
【问题讨论】:
-
需要指出的是:在模板中,如果您希望来自控制器的“数据”不会改变,您可以将数据单向绑定到模板。因此,例如,您可以编写 ng-if="::vm.foo" 而不是 ng-if="vm.foo"
-
谢谢,我通过谷歌搜索 $digest 性能问题找到了这个提示(以及更多提示)。对我来说,问题似乎并不在于性能本身,而是总体上摘要调用的数量(我几乎没有发现任何问题,因为单个循环的性能似乎是一个更常见的问题)跨度>
-
我想当 ctr.foo() 发生变化时你可能会发现这个调用不同
-
就像我上面所说的,我将 ctrl.foo() 替换为始终返回
true的函数,以确保该函数不依赖于反复更新的模型值。跨度>
标签: javascript angularjs performance digest