knockout js - 检查属性是否存在

时间:2012-02-28 04:06:57

标签: knockout.js

我试图用淘汰赛渲染以下内容。

<!-- ko with: address-->
<!-- ko if: address1-->
<span style="display : block">
<span data-bind="varchar : address1"></span>
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->
<!-- /ko -->

问题是即使地址对象存在,它也可能不包含address1参数。 如果参数'address1'为null,我想要淘汰不渲染嵌套的跨度。 目前引发以下错误:

Unable to parse bindings. Message: ReferenceError: address1 is not defined;

任何帮助都非常感激。

4 个答案:

答案 0 :(得分:90)

如果您使用<!-- ko if: $data.address1 -->,那么如果address1未定义,则不会出错。

如果address1稍后会被填充,它将不会更新UI(address1最初需要是可观察的。)

答案 1 :(得分:8)

这不仅仅是移动你的第二个吗?

<!-- ko with: address -->
<span style="display : block">
<!-- ko if: address1 -->
<span data-bind="varchar : address1"></span>
<!-- /ko -->
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->

看起来我们需要查看您的viewModel以及地址如何相互关联。我可以在淘汰页面的样本上做到这一点,没有任何问题:

<h1 data-bind="text: city"> </h1>
<p data-bind="with: coords">
    <!-- ko if: latitude -->
    Latitude: <span data-bind="text: latitude"> </span>,
    <!-- /ko -->
    Longitude: <span data-bind="text: longitude"> </span>
</p>

答案 2 :(得分:6)

我有一个案例,我从不同的地方调用了地址模板。

我的国家/地区名称&#39;数据字段有时为countryName,有时为countryDesc

我刚刚将模板更改为:

 <div data-bind="text: $data.countryName || $data.countryDesc"></div>

这利用了这样一个事实,即如果你使用$data它就不会出错(正如RP Niemeyer所指出的那样)

答案 3 :(得分:0)

此行为的原因可能是您的“地址”可观察的初始数据。

如果您以这种方式初始化您的viewmodel:

this.address = ko.observableArray();

然后“地址”和“地址1”都是未定义的。

解决方法是通过将代码包装到“ko if”语句中来检查块开头的数据,这样:

<!-- ko if: $data --> <br/>
<br/>
<span style="display : block"><br/>
<span data-bind="varchar : address1"></span><br/>
</span><br/>
<span style="display : block"><br/>
<span data-bind="varchar : address2"></span><br/>
</span><br/>
<br/>
<!-- /ko -->