2012-06-09 25 views
3

淘汰賽js的麻煩。但在我看來,這是一個錯誤。也許有一些解決方法。淘汰js強制重新排序數組項後重新綁定

有一個排序列表here的例子,它的工作原理。並且有another example,它沒有。它們之間的唯一區別是KO的版本。

任何幫助,將不勝感激。

更新: 我不知道原因,但調用splice方法後,KO刷新綁定以一些不正確的方式。所以我找到的解決方法 - 強制重新綁定數組模型。

我使用強制重新綁定的代碼如下:

 // newArray is ko.observableArray([...]) 
     var original = newArray(); 
     newArray([]); 
     newArray(original); // KO will rebind this array 

是否有更優雅的方式來強制重新綁定?

+0

我不知道你期待什麼,但我看到_exactly_在兩個頁面相同的行爲。 –

+0

嘗試對物品進行分類 – Serhiy

回答

4

我相信這裏發生的事情是,當你將新項目拼接到它時,Knockout 2.1正確地更新列表,但jQuery UI可排序實現是將項目添加到新列表。

爲了解決這個問題,我在被可排序實現添加的項目中添加了一個'拖動'類,然後在更新兩個數組(這會導致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 
     }); 

你可以看到這方面的工作here