如何在 angular 6 中使用自定义指令呈现动态生成的内联 SVG
How to render dynamically generated inline SVG by using custom directive in angular 6
我在我的应用程序中呈现动态生成的内联 SVG 时遇到困难。
我编写了一个自定义指令,它根据化学反应数据生成内联 SVG。
rxn-to-image.directive.ts
@Directive({
selector: '[appRxnToImage]'
})
export class RxnToImageDirective implements OnInit {
@Input()
set appRxnToImage(rxnString: any) {
this.generateImageFromRxn(rxnString);
}
constructor(
private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef,
private renderer: Renderer2,
private el: ElementRef
) {}
ngOnInit() {
}
private generateImageFromRxn(rxn) {
// custom method that generated inline svg dynamicaaly
MarvinJSUtil.getPackage('#marvinjs-iframe').then(marvinNameSpace => {
marvin = marvinNameSpace;
const exporter = customMethodThatCreatesExporter;
exporter.render(rxn).then(
svg => {
// once svg generated i will call applySvg method to render svg
this.applySvg(svg);
},
error => {
alert(error);
}
);
});
}
private applySvg(svg) {
this.templateRef.elementRef.nativeElement.innerHTML = svg;
this.viewContainerRef.createEmbeddedView(this.templateRef);
}
}
SVG 喜欢这样:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="225" xmlns:ev="http://www.w3.org/2001/xml-events" style="overflow: hidden; "><</svg>
像这样从模板调用指令:
<div *appRxnToImage="reactionString"></div>
我想在 div 中渲染生成的内联 SVG。
这样渲染 SVG。
this.templateRef.elementRef.nativeElement.innerHTML = svg;
this.viewContainerRef.createEmbeddedView(this.templateRef);
谁能帮帮我?
这里是修复的参考:https://stackblitz.com/edit/g4j-structural-directive?file=src/main.ts
基本上在创建嵌入视图后,您可以访问根节点(在您的示例中为 div)并将 innerHTML 设置为它们的(第 37 行 rxn-to-image.directive.ts)
我在我的应用程序中呈现动态生成的内联 SVG 时遇到困难。
我编写了一个自定义指令,它根据化学反应数据生成内联 SVG。
rxn-to-image.directive.ts
@Directive({
selector: '[appRxnToImage]'
})
export class RxnToImageDirective implements OnInit {
@Input()
set appRxnToImage(rxnString: any) {
this.generateImageFromRxn(rxnString);
}
constructor(
private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef,
private renderer: Renderer2,
private el: ElementRef
) {}
ngOnInit() {
}
private generateImageFromRxn(rxn) {
// custom method that generated inline svg dynamicaaly
MarvinJSUtil.getPackage('#marvinjs-iframe').then(marvinNameSpace => {
marvin = marvinNameSpace;
const exporter = customMethodThatCreatesExporter;
exporter.render(rxn).then(
svg => {
// once svg generated i will call applySvg method to render svg
this.applySvg(svg);
},
error => {
alert(error);
}
);
});
}
private applySvg(svg) {
this.templateRef.elementRef.nativeElement.innerHTML = svg;
this.viewContainerRef.createEmbeddedView(this.templateRef);
}
}
SVG 喜欢这样:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="225" xmlns:ev="http://www.w3.org/2001/xml-events" style="overflow: hidden; "><</svg>
像这样从模板调用指令:
<div *appRxnToImage="reactionString"></div>
我想在 div 中渲染生成的内联 SVG。
这样渲染 SVG。
this.templateRef.elementRef.nativeElement.innerHTML = svg;
this.viewContainerRef.createEmbeddedView(this.templateRef);
谁能帮帮我?
这里是修复的参考:https://stackblitz.com/edit/g4j-structural-directive?file=src/main.ts
基本上在创建嵌入视图后,您可以访问根节点(在您的示例中为 div)并将 innerHTML 设置为它们的(第 37 行 rxn-to-image.directive.ts)