简单的单向绑定ng-repeat?

时间:2013-11-05 19:28:41

标签: angularjs angularjs-ng-repeat

我读过一些文章说如果有超过2000个项目,ng-repeat会导致性能不佳,因为有太多的双向绑定要观看。我是angularjs的新手,无法理解ng-repeat和双向绑定之间的关系:

  1. ng-repeat(如输出json对象列表)是否必然会创建双向绑定?

  2. 是否有一种简单的方法只使用单向绑定进行ng-repeat? (最好不需要外部模块)

4 个答案:

答案 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>

以下是两个将显示观察者数量的掠夺者:

All Bindings
Repeater Only

感谢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)

  1. ng-model生成的内容将是数据(模型)上的观察者,如果它超过200个观察者,则会降低页面性能。

  2. 请参阅“单行绑定http://blog.scalyr.com/2013/10/31/angularjs-1200ms-to-35ms/”,但请确保正确使用

  3. 希望它有所帮助!!!