对不起,我没有现场例子,我正在寻找性能建议。
我终于用angular获得了我的第一个性能问题,我有一个非常复杂的UI,在其中,我有一个指令,大约有3个嵌套重复使用指令,在指令使用的每个级别{{1}并使用scope: true
语法。
数据来源不是那么大,但每次重复最终都在30到100名观察者之间(我使用this snippet计算观察者数量)
我在top指令上调用bindToController
,并且它会超过一秒钟(!)来显示HTML(它最终会有几百个侦听器),$compile
和{ {1}}和其他自定义指令,很快就会加起来。
我已经在任何地方添加了一次性绑定,但我仍然总共超过1000个,我想这会减慢速度吗?
我在不同的浏览器中运行了CPU分析器,尽可能深地钻取,我从未看到我的代码占用了大量时间,所有我认为jquery / angular花了很长时间,但没有任何功能里面显示任何重要的自我时间。
如果我打开800毫秒ng-if
,我所看到的只是棱角分明的ng-class
,elemData.handle
以及深深的树丛中的一堆其他角色。
使用$scope.eval
可能是罪魁祸首吗?复杂指令如果使用隔离范围会更好吗?
也许有一些我不知道使用一次性绑定的高级方法?或者双向和单向之间的东西?
编辑:对于后代,这就是发生的事情:我设法用简单的compileDirectives
替换最内层scope: true
级别的隔离范围指令,功能相同,但执行时间是1/1000。我不认为我真的知道为什么差异如此巨大,ng-repeat
中我从未有过很多项目,但代码现在运行时间为1毫秒:)
答案 0 :(得分:4)
$destroy
个事件来清理事件监视器ng-repeat
,ng-options
)$digest
(ng-if="ctrl.isDataLiading()"
慢于ng-if="ctrl.isDataLoaded"
)ng-repeat
的列表项中,请避免使用过滤器来重新计算并在阵列上运行收集观察者,这些过滤器会占用很大一部分性能 - 而是使用ng-if
删除已过滤的项目当我实现的树结构可以像扩展看到子节点(带+选项的列表)时,我一直在努力解决这个问题。上述方法使功能更好,但速度并没有提高很多。
一般来说,我所有的回答都意味着:有角度地填充太多的观察者,摆脱它们