手动更新jquery ui可排序元素

时间:2014-04-01 15:22:54

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

情境: 在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()属性开始获取负值,但尚未添加任何新项目。只需对页面中的现有项目进行排序即可。

1 个答案:

答案 0 :(得分:2)

我会按照this范例将vm绑定到可排序的dom元素。然后你可以专注于命令你的可观察数组