无法使用knockout和knockout-sortable在正确的索引处插入对象

时间:2017-11-23 16:18:23

标签: javascript knockout.js jquery-ui-sortable knockout-sortable

我目前正在尝试使用knockout-sortable开发一个小函数,它应该如下工作。

我有3个可观察的集合:第一个是空的可放置区域,第二个包含集合中的前3个项目(可见),第3个包含我的数据集的其余部分(隐藏)。将项目从第二个集合拖动到第一个集合时,第三个数组中与刚刚移动的项目的“group”属性匹配的第一个项目需要插入到与该项目相同的索引处的第二个observable中。刚拖了出来。这一切似乎都有效,除非在第一个索引处从第3个到第二个数组添加一个项目,它总是在数组的后面结束。我甚至添加了一个if语句,它将使用unshift来解决这个问题,但它似乎不起作用。任何帮助将非常感激。这是一段代码,我尝试将对象插入到正确的索引中。

self.GetNextItemForClass = function(group, sourceIndex) {
  var nextItem = ko.utils.arrayFirst(self.lowPriorityTasks(), function(item) {
    if (item == null)
      return null;

    return item.group() === group;
  });

  if (nextItem != null) {
    var items = self.lowPriorityTasks();
    if (sourceIndex == 0) {
      self.normalPriorityTasks.unshift(nextItem);
    } else {
      self.normalPriorityTasks.splice(sourceIndex, 1, nextItem, items[sourceIndex]);
      ko.utils.arrayRemoveItem(self.lowPriorityTasks(), nextItem);
    }
  }
}

我有一个小提琴here试图说明我面临的问题。

1 个答案:

答案 0 :(得分:1)

要在数组的item索引处插入n,您需要调用:

array.splice(n, 0, item);

您正在使用4个参数调用splice函数。因此,items[sourceIndex]正在向normalPriorityTasks添加额外的项目。

// all parameters after the 2nd get added to the array
array.splice(start, deleteCount, item1, item2, ...) 

splice中删除第四个参数,并将您的功能更改为:

self.GetNextItemForClass = function(group, sourceIndex) {
  var nextItem = ko.utils.arrayFirst(self.lowPriorityTasks(), function(item) {
    if (item == null)
      return null;

    return item.group() === group;
  });

  if (nextItem != null) {
    var items = self.lowPriorityTasks();

    // splice works for zero index as well
    // remove the forth argument from this call
    self.normalPriorityTasks.splice(sourceIndex, 0, nextItem);
    self.lowPriorityTasks.remove(nextItem); // use remove
  }
}

<强> Here's an updated fiddle