基本上這就是我所做的
- 創建一個預定義的結構/類,它知道它是否有 值或只是一個值的列表。
- 在視圖方面顯示下拉列表,如果其他列表只顯示文本。
- 在根vm上嵌套第一步創建的結構並創建字典。
這裏是VM
var optionVM = function (name,isList, v) {
var self = this;
self.name=ko.observable(name);
if (isList) self.values = ko.observableArray(v);
else self.value = ko.observable(v);
self.isList = ko.observable(isList);
self.selected = ko.observable();
}
var vm = function() {
var self = this;
var a1Vm = new optionVM('A1',true, [new optionVM('A11',false,111), new optionVM('A12',false,122)]);
var aVm = new optionVM('A',true, [new optionVM('A2',false,'21'), a1Vm]);
var d = new optionVM('Root',true, [aVm, new optionVM('B',false,'B1'),new optionVM('C',false,'C1')]);
self.dict = ko.observable(d);
}
ko.applyBindings(new vm());
下面是這個視圖
<select data-bind='options:dict().values,optionsText:"name",value:dict().selected'>
</select>
<div data-bind="template: {name: 'template-detail', data: dict().selected}"></div>
<script type="text/html" id='template-detail'>
<!-- ko if:$data.isList -->
<span> List:</span>
<select data-bind='options:values,optionsText:"name",value:selected'>
</select>
<div data-bind="template: {name: 'template-detail', data: selected}"></div>
<!-- /ko -->
<!-- ko ifnot:$data.isList -->
Value:<span data-bind="text:value"></span>
<!-- /ko -->
</script>
這裏是jsFiddle
改進:
- 可以使用isArray來標識optionVM中的列表。
- 一些觀察量可以用簡單的值替換,如果他們不打算改變(例如:姓名)
看起來就像你可能會尋找這樣的事情http://knockoutjs.com/examples/ cartEditor.html –
是的,只是在這個例子中的水平是已知的。我在談論動態創建選擇框。 – haki
你能解釋一下哪些行爲會發生什麼? –