我们将数据传递给组件属性。
如果您使用 [innerHTML] 来呈现来自服务器的 html 内容,它也将起作用。
<div [innerHtml]="templateString"></div>
创建一个组件(这里我已经创建了 - SignatureControlComponent)并将其添加到模块的 entryComponent 中。
@Component({
selector: 'app-signature-control',
templateUrl: './signature-control.component.html',
styleUrls: ['./signature-control.component.scss']
})
export class SignatureControlComponent implements OnInit {
role: string;
}
在 app.nmodule-
entryComponents: [SignatureControlComponent]
在您将要创建组件并添加到 HTML 元素的主组件中(我使用了 EditTemplateComponent)。
使用构造函数注入 ComponentFactoryResolver、ViewContainerRef、Renderer2。
constructor(
private elem: ElementRef, private viewContainerRef: ViewContainerRef,
private componentFactoryResolver: ComponentFactoryResolver, private renderer: Renderer2) { }
使用 ngAfterViewChecked 生命周期钩子获取使用类的 HTML 元素(我使用了类名“签名”)。这也将 [innerHTML] 用于呈现来自服务器的 html 内容。
ngAfterViewChecked() {
if(!this.isElementsRendered)
{
let elements = this.elem.nativeElement.querySelectorAll('.Signature');
if(elements.length > 0)
{
this.isElementsRendered = true;
elements.forEach(element => {
this.CreateSignatureComponent(element);
})
}
}
}
最后创建组件的实例并附加到元素。
CreateSignatureComponent(element: HTMLElement){
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(SignatureControlComponent);
let componentInstance = this.viewContainerRef.createComponent(componentFactory);
const loaderComponentElement = componentInstance.location.nativeElement;
// Assign value to the property
componentInstance.instance.role = 'PMKJ!';
this.renderer.appendChild(element, loaderComponentElement);
}