나는 Knockout viewmodel에 연결된 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>
같은 뭔가 및 순서 변경의 경우 업데이트합니다.