2つの解決策が頭に浮かびます:
- viewmodelの observableArray を購読し、 それが変更されるたびに
DropdownA
の observableArray 内の都市の範囲を置き換えますDropdownB
- オブザーバブル データ コンテキストを使用する: オプション ソースとしてオブザーバブルを使用して、必要に応じて変更できるようにします。最初のものと同じようにサブスクライブし
DropdownA
、都市コレクションが変更されるたびに全体を置き換えます
私は 2 番目のものを選びます。それはよりクリーンだからです。
ここに私があなたのために作ったjsfiddleのサンプルがあります。
HTML:
<select data-bind="options: dropdownA, value: dropdownAValue">
</select>
<select data-bind="options: dropdownB">
</select>
J:
var viewModel = function() {
var _this = this,
dataSource1,
dataSource2;
dataSource1 = ["Hello"];
dataSource2 = ["World"];
_this.dropdownA = ko.observableArray(["A", "B"]);
_this.dropdownB = ko.observable(dataSource1);
_this.dropdownAValue = ko.observable();
_this.dropdownAValue.subscribe(function() {
if (_this.dropdownAValue() == "A") {
_this.dropdownB(dataSource1);
} else {
_this.dropdownB(dataSource2);
}
});
};
ko.applyBindings(new viewModel());
次に、この概念を複数の行で簡単に使用できます: http://jsfiddle.net/jGRQH/
HTML:
<table data-bind="foreach: rows">
<tr>
<td>
<select data-bind="options: $root.dropdownA, value: dropdownAValue">
</select>
</td>
<td>
<select data-bind="options: dropdownB">
</select>
</td>
</tr>
</table>
J:
var rowViewModel = function(dataSource1, dataSource2) {
var _this = this;
_this.dropdownB = ko.observable(dataSource1);
_this.dropdownAValue = ko.observable();
_this.dropdownAValue.subscribe(function() {
if (_this.dropdownAValue() == "A") {
_this.dropdownB(dataSource1);
} else {
_this.dropdownB(dataSource2);
}
});
};
var mainViewModel = function() {
var _this = this,
dataSource1,
dataSource2,
addRow;
dataSource1 = ["Hello"];
dataSource2 = ["World"];
addRow = function () {
_this.rows().push(new rowViewModel(dataSource1, dataSource2));
};
_this.rows = ko.observableArray();
_this.dropdownA = ko.observableArray(["A", "B"]);
addRow();
addRow();
addRow();
};
ko.applyBindings(new mainViewModel());