Динамическая тематика Ionic Issue

Я использую Ionic с Angular для разработки приложения. Я ввел динамические темы, добавив два файла .scss в папку theme. У меня есть app.scss, где я определяю только расположение своих компонентов без цветов. Все цвета находятся в theme-*.scss файлах. Чтобы применить тему, я использую класс над элементом <ion-nav> в моем файле app.html. Что-то вроде этого:

<div [class]="selectedTheme">
  <ion-nav [root]="rootPage" ></ion-nav>
</div>

selectedTheme — это строка, которая принимает название моей темы, поэтому, когда я меняю ее с помощью события, такого как (click) или (ionChange), я могу изменить цвета своего приложения.

Файл theme-*.scss имеет следующую структуру:

.dark-theme {
  ion-header {
    //colors
  }
  ion-content {
    //colors
  }
}

Этот способ работает как шарм, но у меня есть небольшая проблема, которую я хочу избежать. Я установил тему по умолчанию в constructor файла app-components.ts перед знаменитым platform.ready().then(...), который скрывает заставку. Моя проблема в том, что когда экран-заставка скрывается, я вижу свое приложение с его макетом, но без применения правильной темы. Я вижу весь белый фон и все черные цвета в течение небольшого промежутка времени, затем применяется тема по умолчанию. Я импортирую свои пользовательские темы в variables.scss, я пытался импортировать их и в app.scss, но поведение остается прежним. Кажется, что перед импортом тем он применяет макет в app.scss и только после этого применяет импортированную тему со всеми ее цветами. Кто-то уже видел что-то подобное?


person james watt    schedule 25.07.2018    source источник
comment
Я смущен тем, что ваша точная проблема. <б>1. правильный компонент, неправильная тема 2. нет компонента, только белый фон и черный цвет. Каково ваше состояние?   -  person Hyuck Kang    schedule 25.07.2018
comment
При запуске заставка скрывается. На мгновение я вижу свое приложение без темы: все фоны белые, а все цвета текста черные. Затем, через несколько миллисекунд, применяется тема. Почему он не применяется в тот же момент, что и другой код CSS, присутствующий в app.scss?   -  person james watt    schedule 25.07.2018


Ответы (1)


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

почему-first-paint-is-happening-before-domcontentloaded отличное объяснение, связанное с вашим вопросом.

На этой странице рассказывается о том, что первая отрисовка может начаться до полной загрузки DOM.

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

Например. синтаксический анализатор, очевидно, не может генерировать узлы Element до обработки всех его атрибутов, но он может генерировать узел, все еще обрабатывая дочернее дерево. И средство визуализации может отображать узел без его дочерних элементов. И он может быть отрендерен с неполными стилями только для того, чтобы позже пройти перекомпоновку, например. когда javascript вставляет другую таблицу стилей или просто потому, что дочерние узлы, которые еще не были вставлены, влияют на то, как они будут отображаться.

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

person Hyuck Kang    schedule 25.07.2018