我本周一直在与KnockoutJS一起工作,遇到了一个非常具体的问题,希望其他人在我之前遇到并解决了...
本质上,我绑定了一个选择框,但需要能够对实际的选项标签本身进行控制(例如,禁用),这意味着我无法使用“选项”绑定,这当然不能使您细粒度控制选项标签...这是我想出的(有效!)
<select data-bind="foreach: $root.availableLabels, value: Label, enable: !IsConfirmed(), optionsCaption: 'Please select...'">
<option data-bind="text: Value, value: $data, css: { 'paired-label': IsPaired }, disable: IsPaired"></option>
</select>
我的问题与“ optionsCaption”有关,因为我使用的是foreach方法来生成内部选项,因此它无法自动运行,就像我能够使用在剔除页面上找到的更简单的“ Options”绑定一样……如果我要迭代的对象具有空的“ Label”值,它将仅显示列表中的第一个对象,而不是我理想中的“ Please Select ...”。
有谁知道解决这个问题的方法吗?我尚未发布视图模型代码,因为我不确定它实际上是否相关,但是如果需要,请问一下!
简而言之,问题是我需要使用foreach,以便可以在选项上设置css / attr绑定,但是仍然需要“未选中”选项。
在此先感谢您的帮助!
标准选项绑定提供了一种后处理绑定的方法。为此,您需要使用optionsAfterRender
。
您可以在最底部<select>
的kickout.js选项文档页面上找到完整的示例,专门用于禁用选项。
从该页面引用:
如果需要在生成的选项元素上运行其他自定义逻辑,则可以使用optionsAfterRender回调。每次将option元素插入列表时,都会使用以下参数调用回调函数:
- 插入的选项元素
- 与其绑定的数据项,或者为caption元素未定义
<select size=3 data-bind="
options: myItems,
optionsText: 'name',
optionsValue: 'id',
optionsAfterRender: setOptionDisable">
</select>
<script type="text/javascript">
var vm = {
myItems: [
{ name: 'Item 1', id: 1, disable: ko.observable(false)},
{ name: 'Item 3', id: 3, disable: ko.observable(true)},
{ name: 'Item 4', id: 4, disable: ko.observable(false)}
],
setOptionDisable: function(option, item) {
ko.applyBindingsToNode(option, {disable: item.disable}, item);
}
};
ko.applyBindings(vm);
</script>
最终,这意味着您必须修改绑定集合以包括可观察的属性,然后可以在后处理功能中引用该属性。如果我正确理解了文档,则更新可观察对象还应该重新运行您的后处理器。
编辑:您也可以使用此
self.setOptionDisable= function(option, item) {
option.disabled = item.disable()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句