您能给我一些问题的建议吗?我有下一种情况:
1.我从服务器加载项目列表并在容器中用ng-repeat列出它:
<div layout="column" id={{vm.folderId}}container flex layout-align="start center" class='container' dragula='"first-bag"'>
<div id={{item.id}}child class="md-whiteframe-5dp capitalize itemsInList" layout="column" ng-repeat="item in vm.workItems | filter:search">
<div layout="column" flex >
<div class="workItemName">{{vm.getWorkItemName(item.metadata)}}</div>
<div class="workItemDescription">{{vm.getWorkItemDescription(item.metadata)}}</div>
</div>
</div>
</div>
因此,可以说我们列出了下一个列表:
item_1
item_2
item_3
item_4
而不是将另一个元素放入此容器ITEM_5。服务器删除后,服务器会给我新的列表:item_1-item_2-item_3-item_4-item_5,然后vm.workItems
在这里更新:
if (data.ok) {
if (data.content.items.length != vm.workItems.length) {
vm.workItems = data.content.items; //from server
SharedDataService.setLastUpdateTimeStamp(SharedDataService.getNewUpdateTimeStamp());
}
}
在ng-repeat新鲜的物品之后,它也会在列表中查看放置的元素。所以最后我有:
item_1 //ng-repeated
item_2 //ng-repeated
item_3 //ng-repeated
item_4 //ng-repeated
item_5 //ng-repeated
item_5 //droped element
如何避免这种情况?有正常的解决方法吗?
更新。我删除了元素,当它被删除时,我向服务器发出请求以将新项目添加到列表中:
$scope.$on('first-bag.drop', function (e, el, container) {
var elementId = parseInt(el[0].id);
var newContainerId = parseInt(container[0].id);
var newPrevElementId;
var newPrevElement = document.getElementById(el[0].id).previousElementSibling;
if(newPrevElement) {
newPrevElementId = parseInt(newPrevElement.getAttribute('id'));
} else if(!newPrevElement) {
newPrevElementId = newContainerId;
}
if(exContainerId != newContainerId) {
WebSocketService.addItem(elementId, exContainerId,
}
}
你可以做
ng-repeat="item in vm.workItems track by item.id | filter:search"
如果每个项目都有一个唯一的ID(或某些唯一属性),并且您使用track by
ID,则即使服务器返回的先前项目已添加了新项目,DOM也不会重新呈现,只有新项目会被添加到DOM。
柱塞(看一下控制台)
ng-repeat
当对象在对象列表中重复时,$$hashkey
为每个对象添加属性。
当服务器返回新数据时,尽管已经存在对象,但是由于新数据(每个对象)中不包含$$hashkey
属性,因此请ng-repeat
重新渲染,然后认为它们是新对象。
如果使用track by ID
则ng-repeat
不会添加一个$$hashkey
属性,它一直采用跟踪每个项目ID
。因此,即使服务器再次返回相同的数据,由于ID的匹配,ng-repeat
也不会重复它们。如果有新的ID,则将其呈现给DOM。
看一下这篇博客文章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句