使用带有knockout.js的optgroup

时间:2014-12-15 19:47:13

标签: javascript knockout.js

我试图在Ryan Niemeyer的回答here的指导下,在knockout.js中手动渲染optgroups中的选项。它工作正常,但只有立即呈现选项。如果他们随后重新加载,则不会选择正确的项目。

代码和小提琴链接如下。改变

t: ko.observable(null)

t: ko.observable(t)

使它工作,所以问题肯定是延迟加载,我将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>

的JavaScript

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);

1 个答案:

答案 0 :(得分:0)

看起来如果你没有使用选项绑定,当你动态生成新选项时,Knockout根本无法调整内容,即使valueAllowUnset设置为true,所以我的方法根本不起作用;绑定时需要有正确的选项。实现此目的的一个不错的方法是仅在值存在之后呈现select ,如下所示(并且还不需要选项自定义绑定 - 只是对选项的常规值绑定元件)。

http://jsfiddle.net/exyy7hq2/11/

<!-- ko if: t -->
<select data-bind="template: { name: 'selectTemplateType', data: t }, value: selectedId"></select>
<!-- /ko -->
<!-- ko ifnot: t -->
<select>
    <option>No templates loaded</option>
</select>
<!-- /ko -->
<div data-bind='text: selectedId'></div>

<script type="text/html" id="selectTemplateType">
    <option>Select</option>
    <!-- ko foreach: groups -->
        <optgroup data-bind="attr: { 'label': name }, foreach: types">
            <option data-bind="value: id, text: name"></option>
        </optgroup>
    <!-- /ko -->
</script>