我试图用淘汰赛渲染以下内容。
<!-- 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;
任何帮助都非常感激。
答案 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 -->