ここで起こっていることは、Knockout 2.1 がリストに新しいアイテムをスプライスしたときにリストを正しく更新していると思いますが、jQuery UI のソート可能な実装も新しいリストにアイテムを追加しています。
これを回避するために、ソート可能な実装によって追加されるアイテムに「ドラッグされた」クラスを追加し、2 つの配列を更新したら削除しました (これにより、期待どおりに UI が更新されます)。
$list
.data('ko-sort-array', array)
.sortable(config)
.bind('sortstart', function (event, ui) {
ui.item.data('ko-sort-array', array);
ui.item.data('ko-sort-index', ui.item.index());
ui.item.addClass('dragged'); // <-- add class here
})
.bind('sortupdate', function (event, ui) {
var $newList = ui.item.parent();
if($newList[0] != $list[0]){ return; }
var oldArray = ui.item.data('ko-sort-array');
var oldIndex = ui.item.data('ko-sort-index');
var newArray = $newList.data('ko-sort-array');
var newIndex = ui.item.index();
var item = oldArray.splice(oldIndex, 1)[0];
newArray.splice(newIndex, 0, item);
$list.find('.dragged').remove(); // <-- remove the item added by jQuery here
});
ここでこれが機能しているのを見ることができます