Угловая 2/4 Как создать закуску с угловым материалом

Я новичок в Angular2/4 и угловой машинописи. Я хочу стилизовать снэк-бар дизайна угловых материалов, например, изменить цвет фона с черного и цвет шрифта на что-то другое.
Как мне заняться стилем "закусочной"?

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

Как я могу оформить дизайн материала Angular 2 "закусочная" в Angular 2/4? Я включил фрагмент кода ниже:

сервис/ядро

import { Injectable, Inject } from '@angular/core';
import { Observable } from 'rxjs/Observable'
import { DOCUMENT } from'@angular/platform-browser'; 
import { MdDialog, MdDialogRef } from '@angular/material'; 
import { MdDialogConfig, ComponentType } from '@angular/material'; 
import {MdSnackBar} from '@angular/material';

constructor(
    public dialog: MdDialog,
    public snackBar: MdSnackBar,
    @Inject(DOCUMENT) public doc: any   ) {
      dialog.afterOpen.subscribe((ref: MdDialogRef<any>) => {
        if (!doc.body.classList.contains('no-scroll')) {
        doc.body.classList.add('no-scroll');
        }
      });
      dialog.afterAllClosed.subscribe(() => {
        doc.body.classList.remove('no-scroll');
      });        }

   openSnackBar(message: string, action?: string) {
    this.snackBar.open(message, action, {
      duration: 4000,
    });   }

wiz.components.ts....

 saveData(): void {
    this.advisorClientModel.currentStep = this.currentStep;
    this.advisorClientModel.clientId = this.faService.getClientId();
    this.advisorClientModel.isMaxAmount = this.isMaximumAmount;
    this.advisorClientModel.desiredLoanAmount = this.loanAmount;
    this.advisorClientModel.maxLoanAmount = this.eligibleSelected.advanceAmount;
    this.advisorClientModel.pledgedAccounts = this.getPledgedAccountsArray();
    this.advisorClientModel.pledgedMarketValue = this.getPledgedMarkeValue();

    this.faService.updateAdvisorClient( this.advisorClientModel )
      .subscribe(
        successModel => {
          this.coreService.openSnackBar("Your Data Has been Saved");
          this.navigateTo("fa/wiz" + (this.currentStep + 1));
        },
        error => {
          this.onError(error);
        }
      );
  }

Ответ 1

md-snackbar предоставляет сервис для предоставления пользовательских config. Одним из свойств config является extraClasses который позволяет добавлять CSS-классы в контейнер закусочной (doc).

extraClasses можно использовать с ::ng-deep чтобы переопределить классы CSS по умолчанию. Вот пример:

component.ts:

Требуется следующий import в компоненте:

import {MdSnackBar, MdSnackBarConfig} from '@angular/material';

(предоставление пользовательской конфигурации)

openSnackBar(message: string, action?: string) {
  let config = new MdSnackBarConfig();
  config.extraClasses = ['custom-class'];
  this.snackBar.open(message, action ? 'Action Label' : undefined, config);
}

component.css:

::ng-deep snack-bar-container.custom-class {
  background: yellow;
}

::ng-deep .custom-class .mat-simple-snackbar {
  color: green;
}

Вот демоверсия Plunker, если вы хотите попробовать.

ОБНОВЛЕНИЕ НОЯБРЯ 2018 Г.: Angular 6+

Синтаксис немного md- префикс mat- заменен на mat- а дополнительные extraClasses заменены на panelClass. Функция в целом такая же:

const config = new MatSnackBarConfig();
config.panelClass = ['custom-class'];
...

и импорт тоже

import { MatSnackBar, MatSnackBarConfig } from '@angular/material';

Ответ 2

Я сделал следующий код для работы с Angular 6 и Angular Material 6.

Сервис, который содержит закусочные звонки:

@Injectable()
export class MessageService {
   constructor(private snackBar: MatSnackBar) {}

   showError(message: string) {
      const config = new MatSnackBarConfig();
      config.panelClass = ['background-red'];
      config.duration = 5000;
      this.snackBar.open(message, null, config);
   }
}

Добавьте класс css в файл styles.css:

.background-red{
   background-color: rgb(153, 50, 50);
}

Ответ 3

Из SnackBarConfig Class вы можете добавить

panelClass: string | string[]

"Дополнительные классы CSS, которые будут добавлены в контейнер с закусочной".

this.snackBar.open("Your custom Message", '', {
      panelClass:"custom_sneak_bar"
}

Ответ 4

Угловой 5 и выше вам не нужно использовать настраиваемую конфигурацию, просто передайте массив extraClasses после продолжительности в методе openFromComponent.

Вот как

app.module.ts:

  import { MatSnackBarModule } from '@angular/material';

Добавить в корзину

@NgModule({ declarations: [ .. ], imports: [ MatSnackBarModule ].... 

component.ts:

Требуется следующий импорт в компоненте:

import { MatSnackBar } from '@angular/material';

Пример метода, который вызывает SnackBar

openSnackBar(message, type) {
   let extraClasses;
   if (type == 'error') {
     extraClasses = ['background-red'];
   } else {
     extraClasses = ['background-green'];
 }

 this.snackBar.openFromComponent(SnackBarTemplateComponent, {
   duration: 30000,
   extraClasses: extraClasses,
   data: {
     message: message,
     type:type
   }
 });
}

Добавьте соответствующие классы в global style.css style.css:

.background-red{
  background-color: rgb(153, 50, 50);
}
.background-green{
  background-color: rgb(29, 102, 29);
}

Ответ 5

Для угловых 6/7 работает (в вашем глобальном стиле scss для материала)

    @import '../node_modules/@angular/material/_theming.scss';
    @include mat-core();

    $background-primary: #232323;
    $background-accent: #353535;
    $background-warn: #c1640c;
    $font-color-default: silver;

    $my-app-primary: mat-palette($mat-light-green, 700);
    $my-app-accent: mat-palette($mat-cyan, 800 );
    $my-app-warn: mat-palette($mat-red, 400);

    $my-app-theme: mat-dark-theme($my-app-primary, $my-app-accent, $my-app-warn);

    @mixin snack-theme($theme) {
        // Extract whichever individual palettes you need from the theme.
        $primary: map-get($theme, primary);
        $accent: map-get($theme, accent);
        $warn: map-get($theme, warn);


        .mat-snack-bar-container {
            background-color: $background-accent !important;
            color: $font-color-default;
        }
        //Added with panelClass property
        .snack-error {
            button {
                color: mat-color($warn)
            }
        }
        //Added with panelClass property
        .snack-success {
            button {
                color: mat-color($primary)
            }
        }
    }

    @include snack-theme($my-app-theme);

И зову перекусить как

        this.snackBar.open("your message", 
           "your action",
          {
            duration: 3000,
            panelClass: (isSuccess ? ["snack-success"] : ["snack-error"])
          })

Ответ 6

:: Поддержка ng-deep будет удалена, как было объявлено в ближайшее время. Установите инкапсуляцию: ViewEncapsulation.None на вашем компоненте панели сообщений, и вам хорошо идти:

import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';
import { MAT_SNACK_BAR_DATA } from '@angular/material';
import { MessageBarType } from './message-bar.model';

@Component({
  selector: 'app-message-bar',
  templateUrl: 'message-bar.component.html',
  styleUrls: ['message-bar.component.scss'],
  encapsulation: ViewEncapsulation.None
})
export class MessageBarComponent implements OnInit {

  public MessageBarType: typeof MessageBarType = MessageBarType;

  constructor(@Inject(MAT_SNACK_BAR_DATA) public data: { text: String, type: MessageBarType }) { }

  ngOnInit() {
  }
}

Затем в вашем файле scss:

@import '[email protected]/material/theming';
@import '~app/theme-defs';

snack-bar-container {
  &.error {
    background-color: mat-color($warn);
  }

  &.warning {
    background-color: mat-color($dark-warn);
  }

  &.info {
    background-color: mat-color($accent);
  }
}