我读过一些文章说如果有超过2000个项目,ng-repeat会导致性能不佳,因为有太多的双向绑定要观看。我是angularjs的新手,无法理解ng-repeat和双向绑定之间的关系:
ng-repeat(如输出json对象列表)是否必然会创建双向绑定?
是否有一种简单的方法只使用单向绑定进行ng-repeat? (最好不需要外部模块)
答案 0 :(得分:54)
与提及的用户1843640一样,如果您使用的是Angular 1.3,则可以使用一次性绑定,但为了清楚起见,您需要将:: on放在所有绑定上,而不仅仅是转发器。文档说这样做:
<div ng-repeat="item in ::items">{{item.name}}</div>
但是,如果算上观察者,这只会删除一个。要真正删除双向绑定的数量,将::放在转发器中的绑定上,如下所示:
<div ng-repeat="item in ::items">{{::item.name}}</div>
以下是两个将显示观察者数量的掠夺者:
感谢Miraage提供了计算观察员https://stackoverflow.com/a/23470578/2200446
的功能答案 1 :(得分:17)
对于使用或升级到Angular 1.3的任何人,您现在可以使用“一次性绑定”。对于ng-repeat,它看起来像这样:
<div ng-repeat="item in ::items">{{item.name}}</div>
请注意::items
语法。
有关详细信息,请查看Angular documentation for expressions。
答案 2 :(得分:3)
This blog post提供了一些有趣的解决方案。最终结果是:
升级到AngularJS 1.1.5并与limitTo一起使用Infinite scrolling。 AngularJS ng-repeat从版本1.1.4提供limitTo选项。我略微调整了Infinite Scroll指令,使得在容器内滚动可能没有高度100%的窗口。
基本上,您限制最初渲染的对象数,然后使用无限滚动指令根据需要渲染更多。由于您不需要外部模块,因此只需根据需要使用您自己的脚本模仿无限滚动功能。
注意:这应解决您的性能问题,但不会删除双向绑定。
答案 3 :(得分:2)
ng-model生成的内容将是数据(模型)上的观察者,如果它超过200个观察者,则会降低页面性能。
请参阅“单行绑定http://blog.scalyr.com/2013/10/31/angularjs-1200ms-to-35ms/”,但请确保正确使用
希望它有所帮助!!!