因为如果您从中删除一个项目,您将绑定到一个选项数组,那么选项绑定将正确反映这一点。您可以为每个要绑定的选择框使用计算来创建独立的虚拟列表。
var viewModel = function(data) {
var self = this;
this.values = ko.observableArray([ "option 1", "option 2", "option 3"]);
this.selected = [
new ko.observable(),
new ko.observable(),
new ko.observable()
]
this.remaining = function (current) {
var selected = ko.toJS(self.selected),
currentValue = ko.utils.unwrapObservable(current);
var result = ko.utils.arrayFilter(self.values(), function (option) {
return option == currentValue || selected.indexOf(option) === -1;
});
return result;
};
this.values1 = ko.computed(function () {
return self.remaining(self.selected[0]);
});
this.values2 = ko.computed(function () {
return self.remaining(self.selected[1]);
});
this.values3 = ko.computed(function () {
return self.remaining(self.selected[2]);
});
};
ko.applyBindings(new viewModel());
http://jsfiddle.net/madcapnmckay/6uWEu/2/
编辑
这是上述工作的方式。您需要将每个选择绑定到它自己的可观察对象,以便在您选择第一个值时可以更新其他值。如果您只是简单地绑定到同一个列表并在每次选择一个值时从中删除,那么您也将删除您刚刚选择的值,KO 会相应地更新选择元素,它将被完全破坏。
上面的代码通过依次过滤每个来解决这个问题。我将每个下拉菜单重定向到它自己的计算 observable。这些计算出的 observables 只是调用一个过滤器函数,该函数循环遍历 values 数组并过滤掉任何不是当前选定值的已选择值。
因此,如果我们从所有未选择的第一个选择开始,“选项 1”选择了 values1,计算的 values2 和 values3 将由 KO 自动重新计算。以 values1 为例,它将调用
self.remaining("option 1");
values2 * values3 也将调用剩余但未定义,因为它们尚未被选择。
self.remaining(null);
values 数组被过滤为尚未选择且不是当前值的选项。因此,第一次调用剩余将导致[ "option 1", "option 2", "option 3"]
. 对剩余的第二次和第三次调用将导致[ "option 2", "option 3"]
.
如果取消选择第一个选择,则执行相同的操作并返回所有选项。
希望这可以帮助。