Мы можем создать директиву атрибута, которая принимает значение цвета и переопределяет стили по умолчанию <mat-progress-bar>
для нас.
вот рабочая демонстрация: https://stackblitz.com/edit/material-progress-bar-color-directive
вот краткоеобъяснение:
Если мы проверяем <mat-progress-bar>
в инструментах разработчика.мы обнаружим, что цвет индикатора выполнения определяется в псевдоэлементе ::after
следующим образом.
.mat-progress-bar-fill::after {
background-color: #3f51b5;
}
И, как мы уже знаем, невозможно напрямую манипулировать псевдоэлемент с использованием метода DOM querySelector ().Но мы можем добавить новые стили, которые также могут иметь правила для псевдоэлементов.Проверьте эту тему для более подробной информации.https://stackoverflow.com/a/21709814/1160236
Итак, мы можем составить директиву, которая позаботится о добавлении для нас новых стилей.
import { Directive, Input, OnChanges, SimpleChanges, ElementRef } from '@angular/core';
@Directive({
selector: '[appProgressBarColor]'
})
export class ProgressBarColor implements OnChanges{
static counter = 0;
@Input() appProgressBarColor;
styleEl:HTMLStyleElement = document.createElement('style');
//generate unique attribule which we will use to minimise the scope of our dynamic style
uniqueAttr = `app-progress-bar-color-${ProgressBarColor.counter++}`;
constructor(private el: ElementRef) {
const nativeEl: HTMLElement = this.el.nativeElement;
nativeEl.setAttribute(this.uniqueAttr,'');
nativeEl.appendChild(this.styleEl);
}
ngOnChanges(changes: SimpleChanges): void{
this.updateColor();
}
updateColor(): void{
// update dynamic style with the uniqueAttr
this.styleEl.innerText = `
[${this.uniqueAttr}] .mat-progress-bar-fill::after {
background-color: ${this.appProgressBarColor};
}
`;
}
}
, поскольку вы можете видеть, что все, что мы делаем здесь, это просто созданиеновый HtmlStyleElement
и добавление его только внутри элемента host.
А внутри метода updateColor()
мы обновляем innerText
тега стиля, который мы добавили.обратите внимание, что мы используем здесь селектор атрибута с уникальным атрибутом, чтобы минимизировать область применения стиля только для хоста.потому что мы хотим переопределить стиль только для того индикатора выполнения, к которому мы применили нашу директиву.
вы можете использовать эту директиву в своем шаблоне следующим образом.
<mat-progress-bar [appProgressBarColor]="'orange'"
mode="determinate"
value="40"></mat-progress-bar>
Я надеюсь, что этопоможет.