Невозможно вставить объект по правильному индексу с помощью нокаута и сортировки по нокауту

В настоящее время я пытаюсь разработать небольшую функцию, используя сортировку нокаутом, которая должна работать следующим образом.

У меня есть 3 наблюдаемые коллекции: первая - это пустая область для сброса, вторая содержит первые 3 элемента из коллекции (видимые), а третья содержит оставшуюся часть моего набора данных (скрытую). При перетаскивании элемента из 2-й коллекции в 1-ю, 1-й элемент в 3-м массиве, который соответствует свойству «группа» только что перемещенного элемента, должен быть вставлен во 2-ю наблюдаемую по тому же индексу, что и элемент, который был просто вытащил. Кажется, все работает, за исключением того, что при добавлении элемента из 3-го во второй массив по 1-му индексу он всегда оказывается в конце массива. Я даже добавил оператор 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);
    }
  }
}

У меня есть скрипт здесь, который пытается проиллюстрировать проблему, с которой я столкнулся.


person cornelha    schedule 23.11.2017    source источник


Ответы (1)


Чтобы вставить item в nth индекс массива, вам нужно позвонить:

array.splice(n, 0, item);

Вы вызываете splice функция с 4 аргументами. Следовательно, 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
  }
}

Вот обновленная скрипта

person adiga    schedule 23.11.2017