Установите значение переменной sass в Angular 7 - PullRequest
0 голосов
/ 06 февраля 2019

Я работал с angular последние несколько недель, и теперь у меня есть требование динамически стилизовать публичный сайт.Администратор сайта устанавливает различные цветовые коды, а также изображение логотипа от администратора в базе данных.Они будут отражены, когда откроется общедоступный сайт.

Поскольку я из фонового asp.net, ранее я делал бы загрузку главной страницы, получал значения из БД и записывал их в файл .lessи пусть библиотека java-script позаботится об этом.Там все просто.

Но для моей текущей ситуации я использую sass, и я не могу найти способ записать переменные в файл .scss.

Я просто изучил что-то новоеAPP_INITIALIZER из здесь , но в конечном итоге этот пост не показывает, как писать в файле .scss.

Я на самом деле думаю об этом с моим знанием asp.net, но, возможно, я ошибаюсь,или есть другой способ реализации.

Я хочу простое решение, то, что мы делаем в asp.net Я хочу добиться этого таким же образом.

  1. Получить значение переменной из БД через api при первой загрузке приложения.

  2. Запись значений в файл переменной SASS.

  3. После этого SASS позаботится об этом, и мы получим ожидаемый результат.

Для начала приведите несколько предложений или примеров.

Спасибо.

Ответы [ 6 ]

0 голосов
/ 16 февраля 2019

Так как sass - это предварительно скомпилированный css.мы не можем динамически менять тему, не генерируя отдельную theme.css.Вот где JSS начинает играть.JSS - это механизм ввода стиля, основанный на javascript, в котором css напрямую внедряется в используемые вами файлы.

response-angular-material широко использует его, где мы можем динамически передавать переменные цветана изменить тему приложения.

например, этот парень сделал это с angular .

Docs: jss-angular , jss

ссылки: jss-with-angular

0 голосов
/ 15 февраля 2019

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

Как вы и сказали, что хотитеразличные сочетания цветов, вы можете использовать условный CSS SASS.

body[theme="theme1"] {
   // theme 1 css
}

body[them="theme2"] {
    // theme 2 css
}

Вы можете использовать карта темы sass вместе с условным CSS.

Просто обновите свой атрибут, и тема будет применена автоматически.

    themeChange() {
    const dom = document.querySelector('body');
    dom.theme = theme1;    // change theme here
    }

Если вы очень требовательны к какому-либо стилю элемента, который должен быть обновлен из бэкэнда (например, цветовой код), вы можете использовать стиль ng вместе стематический подход.

<some-element [ngStyle]="{'font-style': styleExp}">...</some-element>

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

0 голосов
/ 13 февраля 2019

Как объяснили другие ответы, невозможно установить переменные SASS и обработать их на клиенте, поскольку SASS преобразуется в обычный CSS во время сборки и когда приложение работает или в браузере APP_INITIALIZER может обрабатывать только CSS.

Я вижу два варианта для достижения того, чего вы хотите.

Как правило, у вас есть базовый CSS для приложения, а затем вам нужно загрузить дополнительный CSS в зависимости от настроек администратора.Что необходимо учитывать с точки зрения css, так это то, что вся специфичность css в дополнительном css должна быть больше базовой css, потому что в противном случае она не будет переопределять базовую.Это требует базовых знаний CSS, поэтому я не буду вдаваться в подробности.

Метод 1

Создайте свой дополнительный CSS по запросу сервера.Загрузите его, когда приложение запускается с URL-адреса сервера.Перезагрузите его с помощью js, когда администратор изменит какие-либо настройки.

  1. Определите конечную точку бэкенда по адресу /additional.css (или она может быть похожа на /api/theme/custom-css), которая будет генерировать css из базы данных.Например, у вас есть background=red в дБ, тогда конечная точка должна вернуть
body {background-color: red;}
Добавьте <link id="additionalCss" rel="stylesheet" type="text/css" href="additional.css" /> в <head> из index.html.И этого будет достаточно, чтобы все заработало. Для перезагрузки вы можете использовать разные методы, но я считаю, что это должно сработать
document.getElementById('additionalCss').href = document.getElementById('additionalCss').href;

Это сделает новый запрос к серверуСервер выполнит DB -> css и вернет обновленный css, который будет применен к браузеру.

И если вы хотите быть крутым (или должны поддерживать большие и сложные темы), можно использовать scss.Backend должен генерировать определения переменных scss из базы данных, затем должен использовать какое-нибудь серверное приложение для компиляции scss -> css, а затем передавать скомпилированный css клиенту.Но это будет излишним, если дополнительный css достаточно прост.

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

Метод 2

Если вы не хотите или не можете связываться с бэкэндом.Загрузите настройки из БД с помощью некоторой конечной точки API в json, затем сгенерируйте код CSS на клиенте и примените его.

  1. Используйте HttpClient, чтобы получить настройки JSON и сгенерировать css в виде строки из него.Например, сервер возвращает
{
  "background": "red"
}

, затем вы конвертируете это в строку как

cssCode = 'body {background-color: red}';
Использование
let additionalCssStyle = document.getElementById('additionalCss');
if (! additionalCssStyle) {
  additionalCssStyle = document.createElement("style");
  additionalCssStyle.id = 'additionalCss';
  document.head.appendChild(additionalCssStyle);
}
additionalCssStyle.innerText = cssCode;
Чтобы перезагрузить - сохраните изменения в бэкэнд, затем повторите 1. и 2.
0 голосов
/ 13 февраля 2019

Это невозможно, но вместо использования переменной sass вы используете значение переменной sass.Это может быть любое значение.

Почему?потому что sass компилируется во время упаковки и, в конце концов, он все равно будет генерировать плоскую CSS.

Пример структуры, использующей этот дополнительный процессор стилей, является угловым.


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

https://stackoverflow.com/a/54559350/3070499

0 голосов
/ 12 февраля 2019

Прежде всего, в ASP .NET может быть неплохо, чтобы БД содержала ваши стили и другие ресурсы, связанные с интерфейсом.Это потому, что это платформа рендеринга на стороне сервера.С другой стороны, в Angular это на стороне клиента (за исключением Angular Universal, но вам все равно придется ожидать, что вы будете работать с ним так же).Даже с переводами (i18n или custom) в мире Angular он, скорее всего, хранится на переднем конце, а не сзади (дб или около того).Так что вам придется пойти и сохранить свою «тему» ​​определенным способом, который вы предпочитаете, и перейти к динамическому переключению между ними с помощью Angular.Конечно, вы можете хранить ключи / переменные для стилей / тем, но их фактические значения CSS (классы и тому подобное) должны быть сохранены во внешнем интерфейсе.

Попробуйте увидеть этот простой пример из CSS-переменныхиспользуется при динамической настройке темы приложения (Angular) .Это только один из способов, и существует множество способов сделать это, и вам, возможно, придется искать свои личные предпочтения.

0 голосов
/ 11 февраля 2019

Я не думаю, что то, что вы хотите, будет возможно сделать ... Angular обрабатывает файлы SASS во время сборки приложения и записывает все общие результаты в обычный старый css файл.Специфичные для компонента вещи будут генерироваться как javascript, который, в свою очередь, будет применять ваш стиль во время выполнения.

Следовательно, все переменные SASS, которые вам нужно настроить, должны присутствовать во время компиляции.

Что вы можете сделать, однако, это предварительно определить вашу настройку в угловых компонентах, а затем переключить ее на основе ввода (из вашей БД или где-либо еще), например:

// your.component.ts
@Component({
  // ... component stuff
  styles: ['h1.option1 {color: red;}', 'h1.option2 {color: blue;}'],
  template: `
    <h1 *ngIf="optionSelection$ | async as option; else noOption"
        [class.option1]="option == 1" 
        [class.option2]="option == 2">
       Hey there, I'm styled!
    </h1>
    <ng-template #noOption>
      <h1>No option received</h1>
    </ng-template>
  `
})
export class YourComponent {
  optionSelection$: Observable<number>;
  constructor(yourService: YourService){
    this.optionSelection$ = yourService.getYourOption().pipe(startWith(null));
  }
}

Надеждаэто немного помогает: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...