Я написал угловой компонент для рендеринга русалок графиков с использованием пакета русалка npm .
Он работает как есть (см. Ниже), но яхотел бы найти способ его использования без родительского компонента, который должен включать *ngIf
(чтобы не допустить его рендеринга при отсутствии данных). Мне бы хотелось, чтобы сам компонент мог решать, вызывать ли mermaid.render()
или нет сам. Если *ngIf
не используется, компонент ngAfterContentInit()
может работать, когда graphDefinition
равен null
. Это приводит к ошибке библиотеки mermaid
.
Я мог бы использовать ngOnChanges()
или установщик свойства, чтобы определить, когда установлено значение, но поскольку компонент опирается на ViewChild
, я думаю, что есть опасностьчто ngOnChanges()
или установщик свойств будет выполнен до того, как будет готов ViewChild
.
Вопрос: Можете ли вы предложить способ надежного улучшения этого компонента, чтобы *ngIf
не требовался?
Использование
Пример использования, когда определение графа (строка) предоставляется в виде Observable<string>
из HTTP-вызова в родительском компоненте:
parent.component.html
<mermaid-viewer
*ngIf="graphDefinition$ | async as graphDefinition"
[graphDefinition]="graphDefinition"
></mermaid-viewer>
Компонент
mermaid-viewer.component.html
<div #mermaid></div>
русалка-viewer.component.ts
import {
AfterContentInit,
Component,
Input,
ViewChild
} from "@angular/core";
import * as mermaid from "mermaid";
@Component({
selector: "mermaid-viewer",
templateUrl: "./mermaid-viewer.component.html"
})
export class MermaidViewerComponent implements AfterContentInit {
@ViewChild("mermaid", { static: true })
public mermaidDiv;
@Input()
public graphDefinition: string;
public ngAfterContentInit(): void {
mermaid.initialize({
theme: "default"
});
const element: any = this.mermaidDiv.nativeElement;
mermaid.render(
"graphDiv",
this.graphDefinition,
(svgCode, bindFunctions) => {
element.innerHTML = svgCode;
}
);
}
}