Как включить пользовательские темы материалов в компоненты без дублирования миксинов: mat-core и angular-material-theme - PullRequest
0 голосов
/ 26 октября 2018

Я нашел очень полезное объяснение о том, как применять цветовые схемы / палитры материальных тем для других нематериальных компонентов здесь .

Прежде чем я прочитал это, я подумал о чем-то похожем, но не мог представить, как рассмотреть рекомендацию из Тематическое приложение Angular Material , если я не хочу иметь только глобальные темы:

Ваш пользовательский файл темы не должен быть импортирован в другие файлы SCSS. Это будет дублировать стили в вашем выводе CSS. Если вы хотите использовать ваш объект определения темы (например, $ candy-app-theme) в других файлах SCSS, то определение объекта темы следует разбить на собственный файл, отдельно от включения mat-core и angular -материал-тема миксин.

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

Я новичок в Sass и, возможно, что-то здесь упустил.

Ответы [ 2 ]

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

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

Суть в том, что - как правильно говорится в руководстве по тематике - вы никогда не должны импортировать миксины @include mat-core() и @include angular-material-theme($your-theme) более одного раза во всем проекте.Но когда вы работаете с SASS в своих компонентах, вам часто хочется ссылаться на переменные темы и цветовую палитру.Соблазнительно импортировать всю вашу тему в компонент SASS, случайно дублируя миксины материалов.

Решение, которое я выбрал, я думаю, это то, что руководство по темам описывает

определениеобъекта темы следует разбить на собственный файл, отдельно от включения mixins mat-core и angular-material-theme

, но, поскольку для меня изначально было непонятно, как это сделать,Вот шаг за шагом для тех, кто застрял с тем же:

  1. создайте папку assets/styles/partials, содержащую SASS-части

Моя папка выглядит так:

assets/styles/partials/
  _palette.scss     // custom material palettes
  _scaffolding.scss // general mixins
  _theme.scss       // <-- our theme definition
  _variables.scss   // global variables like fonts and colors

Часть _theme содержит следующее:

// assets/styles/partials/_theme.scss
@import '~@angular/material/theming';
@import 'variables';
@import 'scaffolding';
@import 'palette';

$my-primary: mat-palette($mat-primary);
$my-accent: mat-palette($mat-accent);
$my-warn: mat-palette($mat-warn);

$my-theme: mat-light-theme($my-primary, $my-accent);

Вот и все. не включать в этот файл миксины материалов mat-core и angular-material-theme.

создать глобальный файл темы assets/styles/my-theme.scss.Он содержит всего три строки:
// assets/styles/my-theme.scss
@import 'partials/theme';                    // our actual theme definition
@include mat-core();                         // the required mat-core mixin
@include angular-material-theme($my-theme);  // the declaration of our custom material theme

Этим мы отделили нашу частичную тему, включая всю нашу обычную палитру, леса и переменные, от файла, который включает в себя mat-core и наш пользовательский материалтема.

В Angular.json объявите файл my-theme глобальным в соответствии со стилями
"styles": [ "src/assets/styles/my-theme.scss" ]

При этом наше приложение повсеместно использует нашу собственную тему материала, а потому что определение темы (в части theme) отдельно от включения миксинов материалов (в my-theme), мы можем безопасно включать нашу часть theme в любой компонент без дублирования каких-либо css.

ОпциональноВы можете упростить импорт части нашей темы, добавив путь к частям к stylePreprocessorOptions в Angular.json:

"build": {
  (...)
  "options": {
    (...)
    "stylePreprocessorOptions": {
      "includePaths": [
        "src/assets/styles/partials"
      ]
    }
  }
}

Просто @import 'theme' в любом файле scss компонента, и у нас есть доступ ко всем нашим переменным иТематические функции материала, такие как mat-color:)

0 голосов
/ 26 октября 2018

У вас должно быть это прямо сейчас:

@import '~@angular/material/theming';
@include mat-core();

$candy-app-primary: mat-palette($mat-indigo);
$candy-app-accent:  mat-palette($mat-pink, A200, A100, A400);
$candy-app-warn:    mat-palette($mat-red);

$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn);

@include angular-material-theme($candy-app-theme);

Но вы должны стремиться к этому:

// First file variables.scss
@import '~@angular/material/theming';
@include mat-core();

$candy-app-primary: mat-palette($mat-indigo);
$candy-app-accent:  mat-palette($mat-pink, A200, A100, A400);
$candy-app-warn:    mat-palette($mat-red);
// Second file
@import 'src/variables';

$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn);
@include angular-material-theme($candy-app-theme);

Вот как я это понял.

...