저는 knockout.js의 optgroups 안의 옵션을 Ryan Niemeyer의 답변 here의 지침과 함께 수동으로 렌더링하려고합니다. 그것은 잘 작동하지만 옵션이 즉시 렌더링되는 경우에만 작동합니다. 이후에로드되면 올바른 항목이 선택되지 않습니다.optgroup을 knockout.js와 함께 사용하십시오.
코드와 피들 링크는 다음과 같습니다.
t: ko.observable(t)
에
t: ko.observable(null)
을 변경하면 작동한다, 그래서 문제는 확실히 지연로드, 나는 valueAllowUnset true로 설정해야합니다.
바이올린 : http://jsfiddle.net/exyy7hq2/3/
HTML
<select data-bind="template: { name: 'selectTemplateType', data: t }, valueAllowUnset: true, value: selectedId"></select>
<div data-bind='text: selectedId'></div>
<script type="text/html" id="selectTemplateType">
<!-- ko ifnot: $data -->
<option>No template selected</option>
<!-- /ko -->
<!-- ko if: $data -->
<option>Select</option>
<!-- ko foreach: groups -->
<optgroup data-bind="attr: { 'label': name }, foreach: types">
<option data-bind="option: id, text: name"></option>
</optgroup>
<!-- /ko -->
<!-- /ko -->
</script>
자바 스크립트
ko.bindingHandlers.option = {
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
ko.selectExtensions.writeValue(element, value);
}
};
var t = {
groups: [
{ name: 'a', types: [{id: 1, name: 't1'}] },
{ name: 'b', types: [{id: 102, name: 't2'}, {id: 103, name: 't3'}] },
{ name: 'c', types: [{id: 5, name: 'x'}] }
]
}
var vm = {
t: ko.observable(null),
selectedId: ko.observable(103)
};
ko.applyBindings(vm);
setTimeout(function(){ vm.t(t); }, 2000);