我有一个可观察的项目数组。 “项目”的其中一个属性是“位置”,表示项目在列表中的位置。我希望能够通过在每个项目旁边放置位置下拉菜单来重新排序项目。当用户在下拉菜单中选择某个项目的位置时,将重新计算受影响项目的位置值。使用Knockout JS重新排列列表中的项目
我遇到的问题是当我尝试利用事件绑定下拉 - 我找不到一种方法将原来的新位置传递给我的'重新定位'功能。
我敢肯定,这可以通过使用数组索引这个简单的例子,但我想看看我能否避免这种情况。
的jsfiddle:http://jsfiddle.net/4tqahpkg/3/
<div class='liveExample'>
<ul data-bind="foreach: orderedItems">
<li>
<div> <span data-bind="text: name"> </span> has Position:
<select id="pos" data-bind=" options: orderedItems,
optionsText: function(item) { return item.position },
optionsValue: function(item){ return item.position },
value: position,
event: { change: function() {reposition($data.name(), position()); } } "></select>
</div>
</li>
</ul>
var Item = function (name, position) {
this.name = ko.observable(name);
this.position = ko.observable(position);
}
var viewModel = function() {
var self = this;
this.items = [
new Item("item Three", "3"),
new Item("item One", "1"),
new Item("item Two", "2"),
new Item("item Five", "5"),
new Item("item Four", "4"),
new Item("item Six", "6")];
self.orderedItems = ko.computed(function() {
return ko.utils.arrayFilter(this.items, function (item) {
return true;
}).sort(function (a, b) {
var value1 = "",
value2 = "";
value1 = a.position() ? a.position() : "";
value2 = b.position() ? b.position() : "";
return value1 == value2 ? 0 : (value1 < value2 ? -1 : 1);
});
});
self.curName = ko.observable();
self.curItem = ko.computed(function (name) {
return ko.utils.arrayFilter(this.items, function (item) {
return item.name() == self.curName();
});
});
self.reposition = function (name, newPosition) {
self.curName(name);
origPosition = self.curItem()[0].position();
if (origPosition < newPosition) {
for (var x = 0; x < orderedItems.length; x++) {
if (origPosition < newPosition && self.orderedItems()[x].position() >= origPosition && self.orderedItems()[x].position() < newPosition) {
self.orderedItems()[x].position(self.orderedItems()[x].position() - 1);
}
if (origPosition > newPosition && self.orderedItems()[x].position() >= newPosition && self.orderedItems()[x].position() < origPosition) {
self.orderedItems()[x].position(self.orderedItems()[x].position() + 1);
}
if (self.orderedItems().name() == name) {
self.orderedItems()[x].position(newPosition);
}
}
}
};
};
ko.applyBindings(viewModel);
太奇怪了...界面为什么不通过拖放使用列表重新排序和删除? –
该列表可能包含数百个项目,可能难以拖放。这将是该行动的捷径。 – PaulP