AngularJS中ng-repeat一次性绑定继承:嵌套循环需额外绑定吗?
关于嵌套ng-repeat一次性绑定的问题
首先直接给结论:推荐你给内部的ng-repeat也加上一次性绑定::list,这完全不是冗余操作,反而能帮你优化Angular应用的性能。
为什么这么说?咱们拆解一下:
- 一次性绑定
::的核心作用,就是当表达式的值首次稳定后,Angular就会停止监听它的变化,从而减少不必要的watchers,降低digest循环的负担。 - 你已经给外部的
ng-repeat加了::$ctrl.lists,这确保了Angular不会再监听父数组$ctrl.lists的引用变化。但默认情况下,内部的ng-repeat="item in list"仍然会让Angular为每个子数组list创建一个watcher,监听它的引用或内容是否发生改变。 - 既然你明确说明
$ctrl.lists永远不会发生任何变化——包括父数组本身、子数组的引用,甚至子数组内部的元素都不会变——那这个针对list的watcher就是完全多余的。加上::list后,Angular会在首次渲染后就停止监听这个子数组,彻底去掉这个不必要的性能开销。
修改后的代码应该是这样的:
<div ng-repeat="list in ::$ctrl.lists"> <span ng-repeat="item in ::list">{{item}}</span> </div>
补充一句:如果未来你的需求有变化,比如子数组的内容可能被修改(但父数组的引用不变),那此时就不能给内部的ng-repeat加一次性绑定了。但根据你当前的描述,整个$ctrl.lists都不会变动,所以加上是绝对安全且有好处的。
内容的提问来源于stack exchange,提问作者Sam Claus
相关产品推荐
相关产品推荐

