KnockoutJS如果与多个元素绑定

时间:2013-03-19 10:51:03

标签: javascript mvvm knockout.js

我认为这是一件简单的事情,但我基本上有一个可观察的对象数组,其中包含如下数据:

{
   BasicType: "some-type",
   ExtendedType: "some-extended-type",
   DisplayType: "some-display-type"
}

数据字段总是在模型中,如果没有数据可供显示,它们将是空字符串。

现在这个模型在整个系统中使用,并且是一个简单的POJO,视图模型在视图中需要它们时只包含其中的许多。所以我不想把任何视图特定问题放在“this”对象上,但是可以将它们放在由许多这些较小模型组成的视图模型中。

无论如何,在视图中添加了所有字段,但如果有更适用的类型,则每个字段都有一个if禁用它。所以一个例子就是:

<div data-bind="text: BasicType, if: (BasicType && !ExtendedType && !DisplayType)"/>
<div data-bind="text: ExtendedType, if: (!BasicType && ExtendedType && !DisplayType)"/>
<div data-bind="text: DisplayType, if: (!BasicType && !ExtendedType && DisplayType)"/>

然而由于某些原因,它没有像我期望的那样,我尝试更改!xType xType == '',但是也没有这样的运气,并且还使用括号强制评估但没有。所以,如果不处理多个元素,我是否会遗漏某些东西或者敲门声?

如果有一种简单的方法可以将这些转换为计算的observable,我会很高兴,但是因为这些模型用于跨页面和作为与web服务的契约(它们就像数据层)我不喜欢我想改变它们,我不知道如何将计算值添加到对象中,除非我得到它们,我循环每一个,然后将计算的observable添加到每个,然后使用它。

无论如何,这是一个场景,任何建议都会很棒!

1 个答案:

答案 0 :(得分:1)

如果模型属性不是可观察的,那么您的代码将起作用。如果模型属性是可观察的,则需要执行observable以在比较之前访问值。

<div data-bind="foreach: types">
    <div data-bind="text: BasicType, if: (BasicType() && !ExtendedType() && !DisplayType())"></div>
    <div data-bind="text: ExtendedType, if: (!BasicType() && ExtendedType() && !DisplayType())"></div>
    <div data-bind="text: DisplayType, if: (!BasicType() && !ExtendedType() && DisplayType())"></div>
</div>

以下是一个示例:http://jsfiddle.net/5WMVb/1/