サンプルコードはこちらです。 https://jsfiddle.net/zLnuyk3w/4/observableArray.removeが手動でhtml変更された後正しく動作しない
function ViewModel(){
var self = this;
var ids = [
{ id:50, order:1},
{ id:25, order:2},
{ id:35, order:3}
];
var list = ko.observableArray(ids);
self.sortedList = ko.observableArray();
ko.computed(function(){
var computedList = list().sort(function(l, r){
return l.order < r.order ? -1 : 1;
});
self.sortedList(computedList);
});
self.addNewItem = function(){
list.push({id: 40, order:2});
}
self.deleteItem = function(item){
list.remove(item);
}
}
var vm = new ViewModel();
ko.applyBindings(vm);
$('tbody').sortable({
update: function(event, ui) {
// vm.list().updateOrder(); // somehow update 'order' property but for simplicity reason, omit the actual code
vm.list.valueHasMutated();
}
});
$("tbody").disableSelection();
私は基本的にjqueryのUIソート可能なプラグインを用いて手でテーブルの行をソートしたいです。しかし、手でソートしてobservableArrayから項目を削除しようとすると、removeは正しく機能しません。
関連する問題を徹底的に調べて、ko.cleanNodeを呼び出した後でビューモデルを再バインドする必要があるようです。それがこの問題を解決する唯一の方法ですか?私は実際に私が再生しているデータは動的に生成され、ビューは多くのテンプレートを使用するので、このアプローチを避けたいので、要素を再バインドするための正しいデータを渡すのはかなり複雑です。
ノックアウトのためのjQuery UIのソート可能なバインディングが存在します。あなた自身を転がしてはいけません。 https://github.com/rniemeyer/knockout-sortable – Tomalak
ああ私はそれを知らなかった。あなたの情報をありがとう。私はそれを調べます。 –
結論:最初は思っていた以上に複雑です。 – Tomalak