【发布时间】:2015-12-25 13:39:49
【问题描述】:
让我用一个简单的案例来设置问题。
我有一个 HTML 表格,其中的行由 observableArray 控制。效果很好。
但是,如果 observableArray 中有零个元素,我想要一行这样说。我尝试了这个标记,它“有点”有效:
<tbody data-bind="if: $root.data.contacts().length == 0">
<tr>
<td>There are no contacts specified yet.</td>
</tr>
</tbody>
<tbody data-bind="foreach: $root.data.contacts">
SNIP - a tbody with the rows is here when elements > zero
</tbody>
当我说“有点”时,我的意思是可见的。它确实出现在零元素处,并且确实像您所期望的那样在 > 零元素处消失。但是,当您打开 DOM 检查器(开发工具)并查看内存中的 DOM 时,您会发现有两个 tbody 部分,而不是一个。现在一个 tbody 当然总是空的,但是 两个 tbody 标签不是 HTML5 正确的,所以这个必须修复 这不是想要的标记.
作为一个 Knockout 新手,我尝试用一个虚拟元素来解决这个问题:
<!-- ko if: $root.data.contacts().length == 0 -->
<tbody>
<tr>
<td>There are no contacts specified yet.</td>
</tr>
</tbody>
<!-- /ko -->
不幸的是,这对我们的构建过程不起作用:我们在压缩之前缩小 HTML,并且消除了 cmets。
我的印象是 KO 绑定适用于容器元素本身以及后代,但似乎并非如此。有没有办法告诉 KO 应用于容器元素以及子元素,或者我是否需要以某种方式更改标记而不是虚拟容器?
【问题讨论】:
-
如果表中有两个
tbody标签,您会遇到什么问题? -
好吧,显然没有。我认为多个 元素是非法的,但阅读规范表明允许多个元素。我的问题仍然是关于绑定到容器的问题,但我对 HTML5 正确性的假设是错误的。我会更新。 w3.org/TR/html5/tabular-data.html#the-tbody-element
if绑定控制包含的 元素,而不是绑定所在的元素。如果您检查现场演示,您可以在文档页面上看到这一点。 knockoutjs.com/documentation/if-binding.html 如果你想使用if,你可以有两个完整的表,每个表都包含在一个if-bound div中。这将始终产生两个 div,其中 div 是块级元素,可能会对标记产生负面影响,具体取决于用例。您在下面的答案中使用新的模板标记标记始终是干净的,没有孤立的元素。您可以在标记中使用单个可观察的字符串控件(可能很大)部分这一事实是设计的范式转变。
标签: javascript html knockout.js