假设我将一个大的嵌套对象绑定到代码中所示视图的$scope。现在,更新"e“对象的值。这将导致检查所有绑定并更新DOM。如果我在每个ng-重复指令中使用"track“,这是否意味着只有对"e”对象的绑定才会作出反应,而对于"e“对象的dom会被更新?
<div ng-repeat="a in b">
<div ng-repeat="c in a">
<div ng-repeat="d in c">
<div ng-repeat="e in d">
{{e.value}}<br>
</div>
</div>
</div>
</div>发布于 2016-07-31 20:56:56
无论如何,绑定都将被检查,只有在不同的情况下,才会根据摘要周期进行更新。至于重建DOM元素,角使用唯一标识符来确定ng-repeat中的每个项是否已经有匹配的DOM元素,或者它是否需要呈现一个新的元素。
默认情况下,使用每个对象的$id (或$$hashKey),角创建并管理遮罩下的这些唯一标识符。
后来添加了track by,作为告诉角使用您选择的唯一标识符的方法,而不是在引擎盖下管理它。
当更新数据移除/更改$id或$$hashKey,触发每个DOM元素不必要的重新构建时,这是非常有用的,即使数据根本没有变化。
考虑一下这个例子:
<li ng-repeat="item in data">{{item.value}}</li>DataService更新数据,该方法具有从SQL数据库检索数据的fetch()方法,并返回记录。$scope中的数据需要调用该服务,并将数据变量重新分配给结果:
$scope.data = DataService.fetch();这意味着,即使只有一个项是不同的,所有的$id或$$hashKey属性都会消失或不同,而角将假定所有项都是新的。它将从头开始重新构建所有DOM元素。
但是,由于您的数据来自SQL数据库,您已经有了一个唯一的标识符(主键),即id列。然后,您可以将ngRepeat更改为:
<li ng-repeat="item in data track by item.id">{{item.value}}</li>现在,与其寻找每次重新分配数据时丢失的$$hashKey,不如使用您告诉它的属性(item.id)。由于该属性在重新分配变量时确实持续存在,因此该列表再次被优化,因为角将只为新的item重新构建DOM元素。
https://stackoverflow.com/questions/38686456
复制相似问题