selectedMake是可觀察的,其值將是cascadingOption實例。要在跨度使用:文字綁定,您將需要:
<span data-bind="text: selectedMake().text"></span>
它的工作原理,當你使用訂閱,因爲你得到的觀察到的值。
Select2嘗試將select元素與其內部狀態進行同步。不幸的是,它依賴於每個具有Id值的選項。因爲你不使用optionsValue綁定,所以這是行不通的。我也使用select2,但我已經改變了他們的代碼,以使用optionIndex而不是Id和相當複雜的select2綁定來管理差異,如Ajax和多選。
但是,你得到你的樣品與選擇2的工作...
- 創建一個可觀察到存儲的ID。
- 更改您的值綁定使用Id observable
- 添加optionsValue綁定以從您的源選項返回唯一標識。這將用於同步select2選項和選擇選項。
- 訂閱添加到ID可觀察到過濾器的選項,並從你的選擇陣列
- 返回對象的訂閱添加到可觀察到保存ID同步的值(小心的2個訂閱之間無限循環)
我已更新您的JSFiddle,但差異如下。在此我創建一個包裝函數,以構建一個可觀察/ id對,訂閱間距爲2. 選擇綁定具有不同的值綁定值和添加的選項值綁定 跨度綁定具有不同的文本綁定值。
HTML
<div>
<select id="make" data-bind="options: carMakers, value: selectedMake.id, optionsValue: 'text', optionsText : 'text', optionsCaption : 'Select your make', select2: {}"></select><br/>
Selected Make: <span data-bind="text: selectedMake().text"></span><br/>
<select id="type" data-bind="options: carTypes, value: selectedType.id, optionsValue: 'text', optionsText : 'text', optionsCaption : 'Select your type', enable : carTypes, select2: {}"></select><br/>
Selected Model: <span data-bind="text: selectedType().text"></span><br/>
<select id="model" data-bind="options: carModels, value: selectedModel.id, optionsValue: 'text', optionsText : 'text', optionsCaption : 'Select your Model', enable: carModels, select2: {}"></select><br/>
Selected Model: <span data-bind="text: selectedModel().text"></span><br/>
</div>
的Javascript
var makeObservableForSelect2 = function(sourceOptions, idSelector) {
var target = ko.observable({});
target.id = ko.observable();
target.id.subscribe(function(id) {
var realSource = ko.unwrap(sourceOptions)
if (!realSource) {
return;
};
// Don't set target if id already matches to stop infinite loop.
if (target() && target()[idSelector] === id) {
return;
}
target(realSource.filter(function(item) { return item[idSelector] === id; })[0] || {});
});
target.subscribe(function(value) {
// Don't set id if id already matches to stop infinite loop.
if (target.id() && value[idSelector] === target.id()) {
return;
}
target.id(value[idSelector]);
});
return target;
};
var viewModel = {
carMakers: buildData()
};
viewModel.selectedMake = makeObservableForSelect2(viewModel.carMakers, 'text');
viewModel.carTypes = ko.computed(function(){
return viewModel.selectedMake() ? viewModel.selectedMake().childOptions : null;
});
viewModel.selectedType = makeObservableForSelect2(viewModel.carTypes, 'text');
viewModel.carModels = ko.computed(function(){
return viewModel.selectedType() ? viewModel.selectedType().childOptions : null;
});
viewModel.selectedModel = makeObservableForSelect2(viewModel.carModels, 'text');