アイテムを削除するとオプションの配列にバインドされるため、オプションのバインドはこれを正しく反映します。バインドする選択ボックスごとに計算されたものを使用して、独立した仮想リストを作成できます。
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はそれに応じて選択要素を更新するため、完全に壊れます。
上記のコードは、それぞれを順番にフィルタリングすることでこれを解決します。各ドロップダウンを独自の計算されたオブザーバブルにリダイレクトしました。これらの計算されたオブザーバブルは、values配列をループし、現在選択されている値ではない選択されたものをフィルターで除外するフィルター関数を呼び出すだけです。
したがって、すべての選択を解除して開始すると、最初の選択で「オプション1」が選択され、values1、values2、values3が計算され、KOによって自動的に再計算されます。例としてvalues1を取り上げると、
self.remaining("option 1");
values2 * values3も残りを呼び出しますが、選択されていないため、未定義です。
self.remaining(null);
値の配列は、選択されておらず、現在の値ではないオプションにフィルターされます。したがって、remainingへの最初の呼び出しは結果になり[ "option 1", "option 2", "option 3"]
ます。残りの2番目と3番目の呼び出しは、結果になり[ "option 2", "option 3"]
ます。
最初の選択を解除すると、同じ操作が実行され、すべてのオプションが返されます。
お役に立てれば。