AngularJs / ngTable + ui-Sortable =>重新加载后显示错误的订单

时间:2016-09-02 07:44:36

标签: angularjs angularjs-ng-repeat ng-repeat ngtable angular-ui-sortable

我在表格中重新排序项目时遇到问题 我使用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循环不再困扰我了。

0 个答案:

没有答案