ノックアウトビューモデルに接続されたHTMLビューがあり、アイテムのリストが表示されます。 リストの各項目には、テキストの名前フィールドと数値の注文フィールドが含まれています。 ユーザは、ULリスト内の項目に対して「ドラッグアンドドロップ」アクションを実行できます。項目の順序を示すノックアウト観測可能なフィールド
<div id="wrapper">
<ul data-bind="foreach:Items">
<li draggable="true"
ondragover="event.preventDefault();"
data-bind="event:{dragstart:$root.dragItem,drop:$root.dropItem}">
<label data-bind="text:name"></label>
<label data-bind="text:orderNo"></label>
<input type="text" data-bind="value:name" />
</li>
</ul>
<script type="text/javascript">
var list = [{ name: 'Red', orderNo: 0 }
, { name: 'Green', orderNo: 1 }
, { name: 'Blue', orderNo: 2 }];
function viewmodel() {
var self = this;
self.Items = ko.mapping.fromJS(list);
self.ItemToDrag = ko.observable();
self.dragItem = function (item, event) {
self.ItemToDrag(item);
return true;
}
self.dropItem = function (item, event) {
event.preventDefault();
var up = self.ItemToDrag().orderNo() > item.orderNo();
self.ItemToDrag().orderNo(up ? item.orderNo() - 0.5 : item.orderNo() + 0.5);
//order this list
self.Items.sort(function (left, right) {
return left.orderNo() == right.orderNo() ? 0 : (left.orderNo() < right.orderNo() ? -1 : 1);
});
//set integer number
for (var i = 0; i < self.Items().length; i++) {
self.Items()[i].orderNo(i);
}
}
}
var vm;
$(document).ready(function() {
vm = new viewmodel();
ko.applyBindings(vm, $("#wrapper")[0]);
});
私の質問があり、自動的に注文フィールドの内容を変更するためにノックアウトで可能であるならば、次のように 「ドラッグ&ドロップ」イベントは、項目の順序を変更しますリストの項目がUIを使用して注文を変更したとき。どのフィールド ORDERKEYは、項目の順序を示し
<ul data-bind="foreach:Items,orderKey:orderNo"></ul>
ような何か、とは順序変更の場合に更新します。