Я использую <mat-progress-bar> следующим образом:
<mat-progress-bar
name = "label"
mode = "buffer"
[value] = "percentage"
[bufferValue] = "percentage + 10"
>
</mat-progress-bar>
И он генерирует следующий HTML:
<svg width = "100%" height = "4" focusable = "false" class = "mat-progress-bar-background mat-progress-bar-element">
<defs>
<pattern x = "4" y = "0" width = "20" height = "4" patternUnits = "userSpaceOnUse" id = "mat-progress-bar-82">
<circle cx = "2" cy = "2" r = "2"></circle>
</pattern>
</defs>
<rect width = "100%" height = "100%" fill = "url(whatever)"></rect>
</svg>
Дело в том, что я хочу изменить атрибуты width
и r
, для этого я написал что-то вроде:
const patterns = document.getElementsByTagName("pattern")
this.renderer.setAttribute(patterns[0],"width",this.width);
который работает, НО сам angular каким-то образом заменяет атрибуты на его значение по умолчанию после одного «тика»
Мой вопрос: как я могу связать атрибуты width
и r
из этого автоматически сгенерированного svg? или событие не позволяет Angular обновлять атрибуты
Я ищу что-то вроде:
<mat-progress-bar
...
[attr.svg.defs.pattern.width] = "width"
></mat-progress-bar>
Я также пытаюсь расширить matProgressBar, но я не знаю, где устанавливаются значения этих атрибутов.
не могу найти ничего похожего
ОБНОВЛЕНИЕ. В stackblitz все работает, как и ожидалось, теперь я еще больше запутался, чем раньше.
@Component({
selector: 'progress-bar-configurable-example',
template: `
<mat-progress-bar
class = "example-margin"
[mode] = "'buffer'"
[value] = "value"
[bufferValue] = "value + 10"
>
</mat-progress-bar>`,
styleUrls: ['progress-bar-configurable-example.css'],
})
export class ProgressBarConfigurableExample implements AfterViewInit {
value = 50;
bufferValue = 70;
constructor(private renderer: Renderer2){}
ngAfterViewInit(): void {
const patterns = document.getElementsByTagName("pattern")
this.renderer.setAttribute(patterns[0],"width","30");
setTimeout( ()=> this.value = this.value+20 , 1000)
}
}
Хорошо, я нашел проблему.
*ngFor обновляет <mat-progress-bar>, и я устанавливал его атрибуты только в onAfterViewInit
. Исправление что-то вроде
@Component({
selector: 'progress-bar-configurable-example',
template: `
<div #progressBars *ngFor = "let o of bars">
<mat-progress-bar
class = "example-margin"
[mode] = "'buffer'"
[value] = "value"
[bufferValue] = "value + 10"
>
</mat-progress-bar>
<br/>
</div>`,
styleUrls: ['progress-bar-configurable-example.css'],
})
export class ProgressBarConfigurableExample
implements AfterViewInit
{
value = 10;
bufferValue = 70;
bars = [{}, {}];
@ViewChildren('progressBars') progressBars: any;
constructor(private renderer: Renderer2) {}
ngAfterViewInit(): void {
this.progressBars.changes.subscribe(t => {
const patterns = document.getElementsByTagName('pattern');
this.renderer.setAttribute(patterns[0], 'width', '30');
})
}
}
Как видите, главное подписаться на изменения в @ViewChildren
и снова установить атрибуты.
Спасибо