我正在使用以下代码显示缩略图列表:
<div class ="channel" ng-repeat ="channel in UIModel.channels" ng-class ="{evenchannel: ($index % 2) == 0, oddchannel: ($index % 2) == 1}">
<img class="channel-img" ng-src ="data/channels/{{$index + 1}}/thumb"/>
</div>
在控制器中,我有一个ajax请求,可以抓取新的缩略图。 Angular因此更新图像但导致闪烁。有没有办法在更新DOM的过程中双重缓冲区或没有删除列表?
答案 0 :(得分:32)
要与@ cexbrayat的答案一致,如果您没有任何ID,您也可以将其与track by $index
相关联。这是ng-repeat期间的内部迭代#。
<div ng-repeat="channel in UIModel.channels track by $index"></div>
答案 1 :(得分:12)
您可以在track by
中使用ng-repeat
并使用唯一标识符。如果我认为你的频道对象有一个id,你可以这样做:
<div class ="channel" ng-repeat="channel in UIModel.channels track by channel.id"></div>
跟踪避免了每次更新时完整的DOM删除和重新创建,因为Angular将能够跟踪元素是否与以前相同并保留DOM元素。
答案 2 :(得分:3)
首先尝试@Mark Pieszak和@cexbrayat的答案,但如果您在应用程序中使用ngAnimate
,则可能无法完全解决您的问题。
除了:
<div class="channel" ng-repeat="channel in UIModel.channels track by channel.id"></div>
我需要添加以下CSS来禁用此ng-repeat
的动画:
.channel .ng-leave, .channel .ng-leave-active {
display: none !important;
}
.channel .ng-move, .channel .ng-move-active {
display: none !important;
}
这可确保动画一旦开始,就会立即隐藏该项目。替代方案是实际使用动画,或使用$animate.enabled('div.channel', false);
禁用代码中元素的动画。
答案 3 :(得分:0)
我遇到了同样的问题,使用$ index跟踪最终解决了我的问题。起初我并没有想到它,因为我直接在图像标签中使用它,而另一个ng-repeat是。一旦我把它放在父级div(以及ng-repeat)上就可以了:
at
答案 4 :(得分:0)
作为说明:
如果使用track by $index
并未使用新值更新DOM,则
考虑使用track by 'the properties you expect to change'
,请注意避免ngDupe
错误
e.g:
<div ng-repeat="channel in UIModel.channels track by customExp(channel)">
。 。
$scope.customExp = function(chan) {
return chan.id+chan.thumbnail_url; // this has to ensure uniqueness
}
或
<div ng-repeat="channel in UIModel.channels track by channel.id+channel.thubnail_url">