情境: 在knockout / jquery可排序的ui中排序元素
在可排序项中收到项目时,我使用以下事件:
beforeStop: function (event2, ui2) {
draggedItem2 = ui2.item;
itemDroppedIndex2 = ui2.item.index();
if (fieldInSortable) {
// change order of the item
var startPos = $(this).data('start_position');
// Update order
ko.contextFor(this).$data.updateElementPriorities(startPos, itemDroppedIndex2);
} else {
fieldInSortable = false;
}
},
updateElementPriorities
如下:
self.updateElementPriorities = function (oldIndex, newIndex) {
var fieldUpdated = null;
for (var j = 0; j < self.elementTypes().length; j++) {
var eType = self.elementTypes()[j];
var currPriority = eType.priority();
if (currPriority == oldIndex && !fieldUpdated) {
eType.priority(newIndex);
fieldUpdated = eType;
}
else if (newIndex < oldIndex) {
if (currPriority >= newIndex)
eType.priority(currPriority + 1);
}
else if (newIndex > oldIndex) {
if (currPriority <= newIndex)
eType.priority(currPriority - 1);
}
}
};
我使用以下代码根据priority()获取已排序的项目:
var sorted = elementTypes.sort(function (l, r) {
return l.priority() > r.priority() ? 1 : -1;
});
return sorted;
问题:
添加新元素或排序当前元素时,通常它们不会按照应有的方式进行排序。有时,我的意思是,有时候,它会显示正确的priority()数字,但UI中的顺序不正确。还有其他的算法;更有效地手动进行排序并显示获取正确的排序元素?
我处于一个不能使用任何库或进行重大更改的阶段,这样做会有风险。所以我想在相同的代码结构中提出任何建议/更改
更新:当我进行大量拖动时,某些priority()属性开始获取负值,但尚未添加任何新项目。只需对页面中的现有项目进行排序即可。