我通过KnockoutJS视图模型填充HTML select
元素,如下所示:
<select data-bind="options: $data.answers, optionsText: function(item) { return item.text }, value: selectedAnswer, optionsCaption: 'Choose...'"></select>
我想要做的是通过某种方式设置每个class
元素的option
属性,以便我最终得到:
<option class="someValue">12345</option>
这可以在KnockoutJS中完成吗?我很难找到解决方案。
编辑:
我刚刚尝试了foreach
绑定,正如Artem所建议的那样,它非常接近于我想要的工作。但是有一个问题。
在Question
对象上有一个订阅SelectedAnswer
可观察对象的函数:
this.selectedAnswer.subscribe(function (answer) {}
当我使用foreach
绑定时,subscribe()
会针对每个问题触发一次(在我选择答案之前不应该触发。我认为这是因为“选择。 ..“选项现在没有显示。”
对于foreach
绑定,如何将默认文本设置回“选择...”并停止发送selectedAnswer.subscribe()
直到用户选择了某个项目,而不是列表时正在填充。
编辑:
好的,我就是这样做的。
在KO viewmodel类中,我有一个布尔bindingFinished
,我在selectedAnswer.subscribe()
内检查。如果false
那么我们只是从函数返回;如果是真的那么继续正常。
此外,我通过在数组的开头添加新的Answer
为答案添加默认的“选择”选项。最终结果是,只有在用户选择了选项后,才会在绑定数据时执行subscribe函数。
非常感谢Artem的帮助。
答案 0 :(得分:4)
您可以在foreach
代码中使用options
绑定代替select
:
<select data-bind="value: selectedAnswer">
<option class="someValue">Choose...</option>
<!-- ko foreach: $data.answers -->
<option class="someValue" data-bind="value: $data, text: text"></option>
<!-- /ko -->
</select>
答案 1 :(得分:4)
您可以使用optionsAfterRender
绑定执行此操作
它将为它生成的每个option
元素调用提供的函数
您所要做的就是将该类添加到元素中。
示例:强>
<强> HTML 强>:
<select class="form-control" data-bind="options: list,
optionsAfterRender: addOptionClass"></select>
<强> JS 强>:
this.addOptionClass = function(optionElement) {
optionElement.classList.add("form-control");
};
答案 2 :(得分:0)
对我来说,使用所选值(selectedAnswer)的代码在应用此修复后出错。我通过将value=""
添加到默认选项(选择...)来修复此问题。
答案 3 :(得分:0)
根据以前的答案,我刚刚找到了另一种方法
<select data-bind="foreach: yourArray">
<option data-bind="value: IdValue, text: TextValue, attr: { customAttr: anyValueField }"></option>
</select>
它对我有用。我希望它对其他人有帮助