您可以创建一个渲染组件,它将视图附加到它自己的视图,然后返回内部 HTML。
唯一的问题是组件必须在 页面外 呈现,因为视图必须附加到 DOM,并且您必须使用 setTimeout() 来允许子组件 时间 完成渲染。
或者,您可以使用ngTemplate 引用而不是组件工厂。附加到ViewContainerRef 时,两者基本相同。
这是我写的一个例子,但我没有尝试过:
@Component({
selector: 'app-render',
template: '',
styles: [
'position: absolute',
'top: -99999',
'left: -99999'
],
exportAs: 'appRender'
})
export class RenderComponent {
constructor(private view: ViewContainerRef,
private el: ElementRef<HTMLElement>) { }
public function compile(factory: ComponentFactory<any>): Promise<string> {
return new Promise(resolver => {
this.view.createComponent(template);
setTimeout(() => {
resolver(this.el.nativeElement.innerHTML);
this.view.clear();
});
});
}
}
你必须在你的应用中添加<app-render>组件somewhere,然后调用compile(myComponent),它会返回一个带有HTML字符串的promise。
如果您的 child 组件使用*ngIf 或*ngFor 则需要增加setTimeout() 的持续时间,或者您调用多个setTimeout() 函数。无论哪种方式,您都需要时间让 Angular 呈现 HTML。
不可能使用不同的方法来创建从组件生成 HTML 作为字符串的同步函数。 Angular 不能那样工作。