我正在使用knockout.js编写下拉列表:
views()是使用REST通过JSON实例化的对象数组。 displayName是这些对象的String属性,不可观察。我想比较displayName属性,如果它匹配某个单词,我想将一些样式应用于该选项。
<select id="views" data-bind="
options: views(),
optionsText: 'displayName',
optionsValues: 'id',
value: selectedView,
style: { color: ( displayName == 'some arbitrary text') ? 'red' : 'black' }
"></select>
当我不添加样式绑定时,下拉按预期工作。我可以做一个简单的比较(即1 == 1)并且它可以工作(尽管所有选项都变成红色)。我想要做的是将'displayName'属性与一些任意文本进行比较。它现在只是一个字符串,包含任何文本,但稍后将从我的ViewModel调用此字符串。
这将允许我设置不同样式的某些选项,如果我的视图模型需要它们。有什么想法吗?
答案 0 :(得分:5)
我的解决方案是使用optionsAfterRender回调:
<select id="views" data-bind="
options: views(),
optionsText: 'displayName',
optionsValue: 'id',
value: selectedView,
optionsAfterRender: optionsAfterRender
"></select>
然后在我的模型中:
self.optionsAfterRender = function(option, view) {
if (view.defaultView) {
option.className = 'defaultViewHighlight';
}
};
答案 1 :(得分:1)
您应该能够跟踪selectedView observable的值并针对它的displayName属性进行测试。如果可能,我建议将displayName设为observable。
<select id="views" data-bind="
options: viewers(),
optionsText: 'displayName',
optionsValues: 'id',
value: selectedView,
style: { color: ( $parent.selectedView().displayName == 'not ok') ? 'red' : 'black' } ">
<span data-bind="text: selectedView().displayName" />
将该范围放在底部将允许您查看selectedView()。displayName的值。您需要在样式中添加$ parent的原因是您将元素绑定到selectedView。使用像$(this).displayName这样的东西可能有一种更有效的方法,但是我没有时间制作一个新项目,而且小提琴只接受一个框架