我们可以创建一个属性指令,它接受颜色值并为我们覆盖<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 并将其添加到宿主元素中。
在updateColor() 方法中,我们正在更新我们附加的样式标签的innerText。请注意,我们在这里使用了一个带有唯一属性的属性选择器,以将样式的范围最小化到主机。因为我们只想覆盖我们应用了指令的进度条的样式。
你可以像这样在你的模板中使用这个指令。
<mat-progress-bar [appProgressBarColor]="'orange'"
mode="determinate"
value="40"></mat-progress-bar>
我希望这会有所帮助。