Невозможно вставить объект с правильным индексом, используя knockout и knockout-sortable
В настоящее время я пытаюсь разработать небольшую функцию с использованием сортировки по выбыванию, которая должна работать следующим образом.
У меня есть 3 наблюдаемые коллекции: первая представляет собой пустую область сброса, вторая содержит первые три элемента из коллекции (видимые), а третья содержит остаток моего набора данных (скрытый). При перетаскивании элемента из 2-й коллекции в 1-й элемент 1-го элемента в 3-м массиве, который соответствует свойству "group" только что перемещенного элемента, должен быть вставлен во 2-ю наблюдаемую область с тем же индексом, что и элемент, который был перемещен. просто вытащили. Кажется, все работает, за исключением того, что при добавлении элемента из 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);
}
}
}
У меня есть скрипка, которая пытается проиллюстрировать проблему, с которой я сталкиваюсь.
1 ответ
Чтобы вставить item
в n
ый индекс массива нужно вызвать:
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
}
}