我在表格中重新排序项目时遇到问题 我使用angularJs + ngTable和ui-sortable。
问题是重新加载后重新排序的数据显示的顺序错误。数据是正确的,订单值也是正确的,但它们的显示顺序错误。 它在重新排序项目后重新加载表/视图后发生。它也永远不会发生。 例如,如果我搬家:
1到4
5至2
1至8
3至1
2至6
应遵循以下顺序:
4,3,1,6,7,5,8,2,9,10但在重新装载物品后,他们按此顺序:
4,1,3,6,7,5,9,10,8,2
但是这些项目分配了正确的订单值 你可以在plunker https://plnkr.co/edit/HIh0pnBBjLMzErHzKAd9上查看这个 重新排序上述项目,然后单击按钮重新加载视图。
我发现它在angularJs中的这个代码块的ng-repeat指令期间发生了: //如果我们已经看过这个对象,那么我们需要重用它 //关联的范围/元素
nextNode = previousNode;
// skip nodes that are already pending removal via leave animation
do {
nextNode = nextNode.nextSibling;
} while (nextNode && nextNode[NG_REMOVED]);
if (getBlockStart(block) !== nextNode) {
// existing item which got moved
$animate.move(getBlockNodes(block.clone), null, previousNode);
}
previousNode = getBlockEnd(block);
updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);
错误的兄弟姐妹会发生一些事情,导致数据移动到不同的位置。传递给ng-repeat的数据似乎是正确的。对象具有正确的新订单值。
您可以问,为什么在数据显示正确时重新加载?那就好了,例如,如果有人想通过点击列进行排序。
编辑:看起来我的列表的模型没有更新。如果我使用$ scope。$ apply()在stop()结束时它似乎工作。当由于调用$ scope而有更多数据时,这会导致性能问题。$ apply()在删除每一行时。 当我使用$ scope。$ apply()在stop()之外它不起作用。 :(
我不明白为什么我需要调用$ scope.apply,因为我没有更改范围之外的对象。
所以,问题是现在我如何应用模型更改而不在每个stop()事件上调用$ scope。$ apply()但在重新加载表之前只在结束时调用一次?如果我打电话给$ scope. $ apply on btn click,它不起作用。
编辑/已解决:好的。调用$ apply()的问题是可以通过Jquery初始化sortable。如果你使用ui-sortable指令正确使用它,它也会在内部调用digest但我不需要手动。重构一些代码后,我也可以解决我的加载问题。最后,额外的apply()/ digest循环不再困扰我了。