Могут ли привязки Knockout.js применяться к тегам контейнера и к потомкам?

Позвольте мне задать вопрос с простым делом.

У меня есть таблица 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, поэтому это нужно исправить это не желаемая разметка.

Будучи новичком в нокауте, я попытался решить эту проблему с помощью виртуального элемента:

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

К сожалению, это не работает для нашего процесса сборки: мы минимизируем HTML до сжатия, а комментарии удаляются.

У меня сложилось впечатление, что привязки КО применимы как к КОНТЕЙНЕРНОМУ ЭЛЕМЕНТУ, так и к потомкам, но, похоже, это не так. Есть ли способ сообщить KO, что он применяется к элементам контейнера, а также к дочерним элементам, или мне нужно каким-то образом изменить разметку ДРУГЕ, чем виртуальный контейнер?

Ответы на вопрос(2)

Ваш ответ на вопрос