首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ng-重复轨迹的结合行为

ng-重复轨迹的结合行为
EN

Stack Overflow用户
提问于 2016-07-31 17:09:30
回答 1查看 305关注 0票数 0

假设我将一个大的嵌套对象绑定到代码中所示视图的$scope。现在,更新"e“对象的值。这将导致检查所有绑定并更新DOM。如果我在每个ng-重复指令中使用"track“,这是否意味着只有对"e”对象的绑定才会作出反应,而对于"e“对象的dom会被更新?

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-31 20:56:56

无论如何,绑定都将被检查,只有在不同的情况下,才会根据摘要周期进行更新。至于重建DOM元素,角使用唯一标识符来确定ng-repeat中的每个项是否已经有匹配的DOM元素,或者它是否需要呈现一个新的元素。

默认情况下,使用每个对象的$id (或$$hashKey),角创建并管理遮罩下的这些唯一标识符。

后来添加了track by,作为告诉角使用您选择的唯一标识符的方法,而不是在引擎盖下管理它。

当更新数据移除/更改$id$$hashKey,触发每个DOM元素不必要的重新构建时,这是非常有用的,即使数据根本没有变化。

考虑一下这个例子:

  • 您有一个显示数据记录的ngRepeat: <li ng-repeat="item in data">{{item.value}}</li>
  • 使用服务DataService更新数据,该方法具有从SQL数据库检索数据的fetch()方法,并返回记录。
  • 更新$scope中的数据需要调用该服务,并将数据变量重新分配给结果: $scope.data = DataService.fetch();

这意味着,即使只有一个项是不同的,所有的$id$$hashKey属性都会消失或不同,而角将假定所有项都是新的。它将从头开始重新构建所有DOM元素。

但是,由于您的数据来自SQL数据库,您已经有了一个唯一的标识符(主键),即id列。然后,您可以将ngRepeat更改为:

代码语言:javascript
复制
<li ng-repeat="item in data track by item.id">{{item.value}}</li>

现在,与其寻找每次重新分配数据时丢失的$$hashKey,不如使用您告诉它的属性(item.id)。由于该属性在重新分配变量时确实持续存在,因此该列表再次被优化,因为角将只为新的item重新构建DOM元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38686456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档