我编写了一个 Angular 组件,用于使用mermaid npm 包渲染美人鱼图。
它按原样工作(见下文),但我想找到一种使用它的方法,而不需要父组件包含一个*ngIf
(以防止它在没有数据时尝试渲染)。我希望组件本身能够决定是否调用mermaid.render()
自己。如果*ngIf
未使用,则组件ngAfterContentInit()
可能会在graphDefinition
is时运行null
。这会导致mermaid
库出错。
我可以使用ngOnChanges()
或属性设置器来检测何时设置了值,但由于组件依赖于ViewChild
,我认为在准备好ngOnChanges()
之前或属性设置器会执行的危险。ViewChild
问题:您能否建议一种可靠地改进此组件的方法,以便*ngIf
不需要?
用法
Observable<string>
图定义(字符串)作为父组件中的 HTTP 调用提供的示例用法:
父组件.html
<mermaid-viewer
*ngIf="graphDefinition$ | async as graphDefinition"
[graphDefinition]="graphDefinition"
></mermaid-viewer>
零件
mermaid-viewer.component.html
<div #mermaid></div>
mermaid-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;
}
);
}
}