我有角度ng-repeat指令的问题。 目前我在一些项目上工作,从API我得到一个项目列表(有时可能是1k项目),这个列表应该每5秒刷新一次(它是监视相关项目)。
当列表长度稍长时,网站重新渲染DOM时可能会“慢”。结果是角度重新生成整个DOM(但95%的项目是相同的!)
其中一种可能的方法是将“track by”表达式设置为item.id.但是这里出现了另一个问题,我还想要重新生成项目,例如其他用户更改了描述。由于track by表达于item.id,因此item.description中的更改未更新DOM中的项目。
有多种属性可以追踪?也许有些功能? 或者也许用“手”做比较?
任何想法,代码示例我都会感激:)
更新
当我设置跟踪到item.id angular时,我发现了没有重新创建项目的html,只更新已经创建的元素中的值,它似乎“更快”然后删除和创建。 以前我虽然有点不同。FIX
对于那些希望在 ng-repeat USE 跟踪item.id 的> 1k项目中获得更好性能的人,它会提升您的表现;)
答案 0 :(得分:33)
您无需创建一个函数来处理多属性的跟踪。 你可以这样做:
<div ng-repeat="item in lines track by item.id+item.description">
答案 1 :(得分:21)
正如评论建议你可以尝试这样的事情:
<select ng-model="item" ng-options="item.id as item.description for item in items track by itemTracker(item)">
在您的控制器中:
$scope.itemTracker= function(item) {
return item.id + '-' + item.description;
}
这可能有助于在列表更改时重新呈现的DOM元素数量。
答案 2 :(得分:0)
据我所知,angularjs模型绑定到ui视图,因此一旦值发生变化,模型将通过$ apply或$ digest重新渲染。所以在你的情况下,你将模型值绑定到ui视图,但如果值没有改变,也不想重新渲染视图,这是不可能的。这就是我所知道的。
然而,你可以操纵dom元素。例如 将数据存储到变量
var x = [{id:"id1",value:"v1"},{id:"id2",value:"v2"}]
在html中,手动追加或使用指令追加,然后将id分配给元素
<div id="id1">v1</div>
根据您的需要检查并比较值。 一旦找到,则angular.element(&#34;#yourid&#34;)。text()
这将解决您的浏览器资源消耗问题。