KnockoutJS - select与optgroup和javascript对象的绑定值

use*_*734 29 javascript jquery knockout.js

我在这里找到了一个示例,使用KnockoutJS创建一个带有optgroups的选择列表.这工作正常,但我想将下拉列表的值绑定到我自己的javascript对象,然后访问该对象的特定属性:

<select data-bind="foreach: groups, value:selectedOption">
    <optgroup data-bind="attr: {label: label}, foreach: children">
        <option data-bind="text: label"></option>
    </optgroup>
</select>
Run Code Online (Sandbox Code Playgroud)
function Group(label, children) {
    this.label = ko.observable(label);
    this.children = ko.observableArray(children);
}

function Option(label, property) {
    this.label = ko.observable(label);
    this.someOtherProperty = ko.observable(property);
}

var viewModel = {
    groups: ko.observableArray([
        new Group("Group 1", [
            new Option("Option 1", "A"),
            new Option("Option 2", "B"),
            new Option("Option 3", "C")
        ]),
        new Group("Group 2", [
            new Option("Option 4", "D"),
            new Option("Option 5", "E"),
            new Option("Option 6", "F")
        ])
    ]),
    selectedOption: ko.observable(),
    specialProperty: ko.computed(function(){
       this.selectedOption().someOtherProperty();
    })
};

ko.applyBindings(viewModel);
Run Code Online (Sandbox Code Playgroud)

RP *_*yer 40

这种情况的一个很好的选择是创建一个快速自定义绑定,让您的"手工制作"选项的行为与options绑定创建的选项相同(将对象作为元数据附加).绑定可能看起来像:

ko.bindingHandlers.option = {
    update: function(element, valueAccessor) {
       var value = ko.utils.unwrapObservable(valueAccessor());
       ko.selectExtensions.writeValue(element, value);   
    }        
};
Run Code Online (Sandbox Code Playgroud)

您会像以下一样使用它:

<select data-bind="foreach: groups, value: selectedOption">
    <optgroup data-bind="attr: {label: label}, foreach: children">
        <option data-bind="text: label, option: $data"></option>
    </optgroup>
</select>
Run Code Online (Sandbox Code Playgroud)

示例:http://jsfiddle.net/rniemeyer/aCS7D/

  • 这不适用于预先选择的选项(当selectedOption在绑定完成之前获取值时) (6认同)
  • 您如何在此解决方案中添加“ optionsCaption”?@RP尼迈耶 (2认同)

小智 10

这个版本带有标题,如果你想选择父项:

<select data-bind="value: selectedOption ">
    <option data-bind="value:'', text:'Select'"></option>
    <!-- ko foreach: groups -->
        <optgroup data-bind="attr:{label: label}">
            <option data-bind="value: $data, text:label"></option>
            <!-- ko foreach: children -->
                <option data-bind="value: $data, text:label"></option>
            <!-- /ko -->
        </optgroup>
    <!-- /ko -->
</select>
Run Code Online (Sandbox Code Playgroud)