我找到了一个here的例子,它使用KnockoutJS创建了一个带有optgroups的选择列表,这个方法很好用,但是我想把下拉列表的值绑定到我自己的javascript对象,然后访问该对象的一个特定属性:第一个
z0qdvdin1#
对于这种情况,一个好的选择是创建一个快速自定义绑定,让您的“手工”选项以与options绑定创建的选项相同的方式运行(将对象作为元数据附加)。
options
ko.bindingHandlers.option = { update: function(element, valueAccessor) { var value = ko.utils.unwrapObservable(valueAccessor()); ko.selectExtensions.writeValue(element, value); } };
您可以像这样使用它:
<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>
示例:http://jsfiddle.net/rniemeyer/aCS7D/
cyej8jka2#
此带有标题的版本,如果要选择父项:
<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>
dgsult0t3#
如果你想完全控制标题、组和选项,并在select元素上绑定值,你必须确保在绑定select元素的值绑定之前绑定所有选项,否则一旦添加了标题选项,值绑定就会清空selectedOption。例如,您可以添加一个自定义的valueAfterChildren绑定,它 Package 了值绑定并确保children are bound first。请看下面的示例,它在应用绑定之前,在稍微简化的视图模型上预先选择了“Option 5”:第一个
valueAfterChildren
3条答案
按热度按时间z0qdvdin1#
对于这种情况,一个好的选择是创建一个快速自定义绑定,让您的“手工”选项以与
options
绑定创建的选项相同的方式运行(将对象作为元数据附加)。您可以像这样使用它:
示例:http://jsfiddle.net/rniemeyer/aCS7D/
cyej8jka2#
此带有标题的版本,如果要选择父项:
dgsult0t3#
如果你想完全控制标题、组和选项,并在select元素上绑定值,你必须确保在绑定select元素的值绑定之前绑定所有选项,否则一旦添加了标题选项,值绑定就会清空selectedOption。
例如,您可以添加一个自定义的
valueAfterChildren
绑定,它 Package 了值绑定并确保children are bound first。请看下面的示例,它在应用绑定之前,在稍微简化的视图模型上预先选择了“Option 5”:第一个