Який найкращий спосіб приховати екран, поки будуються прив’язки js з нокаутом?


76

Я великий шанувальник нокаутів. Зараз я використовую його для всіх своїх веб-розробок і просто люблю. Одне, що мені не вдалося зрозуміти, це те, як приховати інтерфейс, поки будуються прив'язки knockoutjs.

Наприклад, у мене дуже надійний користувальницький інтерфейс, на моїй сторінці використовується безліч шаблонів. Проблема, яку я помічаю, полягає в тому, що коли користувач вперше відвідує сторінку, вони бачать усі мої шаблони на частку секунди перед тим, як прив’язки ввімкнеться, і сховають їх.

Який найкращий спосіб вирішити цю проблему? Я намагався використовувати допоміжні класи, щоб приховати їх, але тоді шаблони не можуть відображатися за допомогою прив'язок 'visible' та 'if', якщо я не видалю посилання на допоміжний клас (тобто ui-helper-hidden).

Відповіді:


71

Є кілька стратегій, які ви можете використовувати тут.

-Одним є розміщення всього вашого фактичного вмісту в шаблонах, які містяться в тегах скриптів (добре працює з рідними шаблонами). Потім у шаблоні можна використовувати прив’язки керування-потоком. Це буде приблизно так:

<div data-bind="template: 'contentTmpl'"></div>

<script id="contentTmpl" type="text/html">
   <ul data-bind="foreach: items">
       <li data-bind="text: name"></li>
   </ul>
</script>

-Іншим вибором є використання style="display: none"на контейнерному елементі разом із visibleпалітуркою, яку можна прив’язати до loadedспостережуваного, де ви зміните спостережуваний на trueпісля накладання прив’язок.


1
Для запису я використовував пропозицію "завантажений", і це не працювало для мене. Усі мої посилання на js знаходяться внизу моєї сторінки, і розмітка була видимою до виклику applyBindings (останній рядок js). Я просто хотів додати це як примітку, оскільки саме цю проблему я намагався вирішити спочатку. Знову дякую!
Люк

4
Я відредагував відповідь, щоб описати, яким чином loadedможе працювати спостережуваний. Вам потрібно додати style="display: none"елемент-контейнер разом з visible: loaded, а потім перемкнути його на істину після того, як ваші прив'язки будуть застосовані. visibleЗв'язування прибере display: none(він не може контролювати те , що у вашому CSS).
RP Niemeyer

@RPNiemeyer, другий підхід не міг би зробити так добре для SEO, якщо сервер повертав не JS-сторінки. У моєму випадку нокаут додає шар до інтерфейсу, який генерується сервером, display:noneботи можуть не отримати його.
Джейсон Дж. Натан,

196

Я просто шукав у Google, і, використовуючи спостережуваний спосіб, я подумав про інший підхід:

<div style="display: none" data-bind="visible: true">
  <ul data-bind="foreach: items">
    <li data-bind="text: name"></li>
  </ul>
</div>

Вам не потрібно спостережуване, видиме завжди оцінить як істинне, як тільки прив'язка даних буде виконана.


13
Відмінно! Ще одна оптимізація на додачу до того, коли ви не хочете, щоб зайвий div: <ul data-bind="foreach: items, visible: true"> <li data-bind="text: name"></li> </ul>
Грег Р

15
Thx за це! Слід додати, що я щойно додав стиль / прив’язку даних до мого існуючого div і з якоїсь причини приховав лише його частину. Тому я додав зовнішній div. До речі, я також додав це раніше <div data-bind='visible: false'> Screen loading... </div>
joelhoro

3
Відмінно! Ви також можете мати div, який містить завантажувальну анімацію з бінгом даних "visible: false".
Michael Fry

1
Angular намагається зробити занадто багато. Я завжди віддаватиму перевагу простоті нокауту в поєднанні з іншими бібліотеками, такими як SammyJS
pim

1
Можливо, трохи пізно на вечірку, але ви можете зробити, <div class="beforeReady" data-bind="css: {ready: true}">якщо хочете зробити css-анімацію для її відображення (наприклад, непрозорість чи щось інше)
Томас

0

Ось лише метод CSS, якщо вас турбують нестильові віджети, які з’являться до прив’язки реалізацій MVVM .

[data-role]:not([role], [tabindex]) {
    visibility: hidden;
}

Я не тестував його на всіх віджетах Kendo, але, схоже, це працює для більшості.


0

Ось альтернативний підхід, який використовує класи для "приховати та показати" замість вбудованого стилю. Додайте клас "приховати" до елемента, який потрібно приховувати до завантаження вмісту, та додайте прив'язку даних "css", щоб зробити це відображатиметься, коли він зв’язаний.

<div class="hide" data-bind="css: {'show': true}">

</div>

Класи "сховати" та "показати" вже визначені в Bootstrap.

Якщо Bootstrap не використовується, CSS можна визначити як:

.hide {
  display: none !important;
}
.show {
  display: block !important;
} 

Порядок має значення. Клас "приховати" слід визначити перед "show".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.