太多的监听器和慢的$ compile,需要性能提示或双向绑定和一次性绑定之间的某种东西

时间:2015-11-04 22:24:30

标签: angularjs performance

对不起,我没有现场例子,我正在寻找性能建议。

我终于用angular获得了我的第一个性能问题,我有一个非常复杂的UI,在其中,我有一个指令,大约有3个嵌套重复使用指令,在指令使用的每个级别{{1}并使用scope: true语法。

数据来源不是那么大,但每次重复最终都在30到100名观察者之间(我使用this snippet计算观察者数量)

我在top指令上调用bindToController,并且它会超过一秒钟(!)来显示HTML(它最终会有几百个侦听器),$compile和{ {1}}和其他自定义指令,很快就会加起来。

我已经在任何地方添加了一次性绑定,但我仍然总共超过1000个,我想这会减慢速度吗?

我在不同的浏览器中运行了CPU分析器,尽可能深地钻取,我从未看到我的代码占用了大量时间,所有我认为jquery / angular花了很长时间,但没有任何功能里面显示任何重要的自我时间

profiler

如果我打开800毫秒ng-if,我所看到的只是棱角分明的ng-classelemData.handle以及深深的树丛中的一堆其他角色。

使用$scope.eval可能是罪魁祸首吗?复杂指令如果使用隔离范围会更好吗?

也许有一些我不知道使用一次性绑定的高级方法?或者双向和单向之间的东西?

编辑:对于后代,这就是发生的事情:我设法用简单的compileDirectives替换最内层scope: true级别的隔离范围指令,功能相同,但执行时间是1/1000。我不认为我真的知道为什么差异如此巨大,ng-repeat中我从未有过很多项目,但代码现在运行时间为1毫秒:)

1 个答案:

答案 0 :(得分:4)

  1. 使用$destroy个事件来清理事件监视器
  2. 在任何地方使用单向绑定,您可以手动更改(ng-repeatng-options
  3. 在模板中尝试避免将返回值的函数。不需要编译简单的赋值,但函数将运行每个$digestng-if="ctrl.isDataLiading()"慢于ng-if="ctrl.isDataLoaded"
  4. 在包含大量ng-repeat的列表项中,请避免使用过滤器来重新计算并在阵列上运行收集观察者,这些过滤器会占用很大一部分性能 - 而是使用ng-if删除已过滤的项目
  5. 当我实现的树结构可以像扩展看到子节点(带+选项的列表)时,我一直在努力解决这个问题。上述方法使功能更好,但速度并没有提高很多。

    一般来说,我所有的回答都意味着:有角度地填充太多的观察者,摆脱它们