Поскольку стили scss должны быть скомпилированы в css, чтобы ваш браузер мог их понять, динамическое изменение scss не поможет, если мы не перекомпилируем стили на лету. Хотя это вариант, я полагаю, что это не самая эффективная для клиента компиляция стиля.
Другой способ сделать это включает использование переменных css в скомпилированном файле css темы и изменение значения этих переменных во время выполнения. Для этого вы можете использовать существующий файл theme.scss, но вам нужно будет скомпилировать его в css с помощью node-sass; из командной строки запустите:
node_modules/.bin/node-sass src/theme.scss -o outputFolder
Вы также можете использовать один из готовых файлов темы Material css. Откройте этот файл css и выполните поиск и замену всех экземпляров основного, акцентного и предупреждающего цветов для использования переменных css, например, var(--primary-color)
, var(--accent-color)
, var(--warn-color)
. Их может быть немного сложно найти, если только вы не знаете шестнадцатеричное значение цвета, который ищете, поэтому ищите .mat-primary
, .mat-accent
и .mat-warn
, и вы найдете нужные вам шестнадцатеричные значения заменить на весь файл. Затем мы определим цвета темы по умолчанию для использования на корневом уровне:
:root {
--primary-color: purple;
--accent-color: yellow;
--warn-color: red;
}
Поскольку теперь мы собираемся использовать этот новый файл CSS вместо файла scss для нашей темы, нам нужно заменить файл scss в нашем файле angular.json, чтобы он указывал на новый файл CSS. Когда вы получаете значения цвета из базы данных, вы можете установить эти переменные в шестнадцатеричные значения с помощью этого:
document.body.style.setProperty('--primary-color', #someColor);
document.body.style.setProperty('--accent-color', #someColor);
document.body.style.setProperty('--warn-color', #someColor);
Вот блик стека , показывающий простую демонстрацию этой работы.