2

我正在使用 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 调用此字符串。

如果我的视图模型需要,这将允许我以不同的样式设置某些选项。有任何想法吗?

4

2 回答 2

6

我的解决方案是使用 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';
            }
        };
于 2013-07-18T08:24:32.973 回答
1

您应该能够跟踪 selectedView observable 的值并针对它的 displayName 属性进行测试。如果可能的话,我建议将 displayName 设为可观察的。

http://jsfiddle.net/p5T8V/

<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 的东西可能有一种更有效的方法,但我没有时间制作一个新项目,fiddle 只接受一个框架

于 2013-07-17T15:31:45.037 回答