¿Se pueden aplicar los enlaces de Knockout.js a las etiquetas de contenedor Y a los descendientes?

Permítanme configurar la pregunta con un caso simple.

Tengo una tabla HTML, cuyas filas están controladas por una matriz observable. Funciona muy bien

Sin embargo, si el observableArray tiene cero elementos, quiero que una sola fila lo diga. Probé este marcado, que "tipo de" funciona:

<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>

Cuando digo "tipo de", quiero decir VISIBLEMENTE. Realmente aparece en cero elementos y realmente desaparece en> cero elementos como lo que cabría esperar. Sin embargo, cuando abre el inspector DOM (herramientas de desarrollo) y mira el DOM en la memoria, descubre que hay DOScuerpo secciones, no una. Ahora unocuerpo siempre está vacío, por supuesto, perodoscuerpo las etiquetas no son HTML5 correctas, por lo que esto debe corregirse Este no es el marcado deseado.

Siendo un novato de Knockout, intenté solucionar este problema con un elemento virtual:

<!-- ko if: $root.data.contacts().length == 0 -->
<tbody>
    <tr>
        <td>There are no contacts specified yet.</td>
    </tr>
</tbody>
<!-- /ko -->

Desafortunadamente, esto no funciona para nuestro proceso de construcción: minimizamos HTML antes de la compresión y los comentarios se eliminan.

Tenía la impresión de que los enlaces KO se aplicaban tanto al ELEMENTO CONTENEDOR como a los descendientes, pero parece que esto no es así. ¿Hay alguna manera de decirle a KO que se aplique a los elementos del contenedor, así como a los hijos, o necesito cambiar el marcado de alguna manera que NO sea un contenedor virtual?

Respuestas a la pregunta(2)

Su respuesta a la pregunta