Подтвердить что ты не робот

Как предотвратить показ Html до привязки нокаута

Я использую следующие сценарии нокаута в своем Html:

<!-- kno ifnot: bla -->

 <tr><td>some stuff</td></tr>

<!-- /ko -->

Проблема заключается в том, что перед выполнением привязок эта строка будет отображаться на секунду или два.

Как я могу предотвратить это?

4b9b3361

Ответ 1

Вот простой трюк. Просто сделайте свой корневой элемент изначально скрытым и установите видимое привязку в true.

<div style="display: none;" data-bind="visible: true">
    <!-- the rest of your stuff -->
</div>

Как только он будет вынесен, прежде чем нокаут сделает свое дело, он будет изначально скрыт. Когда привязки применяются, нокаут переопределяет стиль и делает его видимым.


Кроме того, вы можете бросить свое представление в блок script и создать его через шаблон. Блоки script не будут отображаться, но будут видны, когда нокаут отображает шаблон.

<!-- ko template: 'myView' --><!-- /ko -->
<script id="myView" type="text/html">
    <!-- the rest of your stuff -->
</script>

Ответ 2

Поскольку поведение, которое вы хотите часто, меняется от страницы к странице - это то, что я делаю в своем файле макета/шаблона (ASP.NET).

 <div class="ko-unbound" data-bind="css: { 'ko-unbound': false, 'ko-bound': true }">
    @RenderBody()
 </div>

Когда страница привязана:

  • ko-unbound класс удаляется со страницы (изначально добавляется атрибут class). На страницу добавлен класс
  • ko-bound.

Затем на странице, где нежелательный контент является проблемой, я могу настроить css для отображения или скрытия объектов на основе этих двух классов. Я также использую эту технику, чтобы показать изображение загрузки или, возможно, наложить минимальную высоту для элемента.

.ko-unbound #storeWizard
{
    display: none;  // hide entire section when the page is binding
}

.ko-bound #loadingGraphic
{
    display: none;  // hide loading graphic after page is bound
}

Во время тестирования при применении привязок я добавляю таймаут, чтобы я мог видеть вспышку.

 setTimeout(function ()
 {
     ko.applyBindings(RR.VM);

 }, 300);

Ответ 3

Оберните свой html в нечто вроде этого -

<div id="hideme" style="display:none">
</div>

Затем в вашем JavaScript добавьте следующую строку jquery после привязки привязки -

$('#hideme').show(); 

Это самый простой метод, который я нашел, что работает. Вы можете сделать это с помощью некоторых привязок нокаута, но вы теряете гарантированное время, потому что вы не можете контролировать привязки заказов.

Ответ 4

Другое решение, которое я нашел здесь

<div id="binding-start" style="visibility:hidden" data-bind="attr: { 'style': 'visibility:visible' }" />

Это имеет преимущество - или недостаток, в зависимости от ваших потребностей - это пространство будет зарезервировано для скрытого контента. Страница не будет "прыгать" при применении привязок.