在我的Angular 4應用程序中,我需要動態創建兩個組件並將它們注入到模板中。我已經用一個組件成功完成了這一工作,但現在我需要添加另一個組件。根據屬性的值選擇元素主機
我有這樣的指令:
import { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[component-host]',
})
export class ComponentHost {
constructor(public viewContainerRef: ViewContainerRef) { }
}
,我有這樣的HTML模板摘錄:
<!--- HTML --->
<ng-template component-host></ng-template>
這ViewChild
:
// TypeScript
@ViewChild(ComponentHost) componentHost: ComponentHost;
這一切的偉大工程,我有一些代碼創建該組件並插入它。但是,現在我需要在同一個模板中動態注入附加組件。目前,我必須分開指令,但這顯然不是最佳解決方案。是否可以使用屬性的值來選擇@ViewChild
中的元素?沿着線的東西:
<!--- HTML --->
<ng-template component-host='replace1'></ng-template>
<ng-template component-host='replace2'></ng-template>
// TypeScript
// How do I select the element with an attribute with a certain value?
@ViewChild(ComponentHost) componentHost: ComponentHost;
我創造我的部件是這樣的:
protected createComponent(componentType: Type<any>, componentHost): any {
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentType);
const viewContainerRef = componentHost.viewContainerRef;
viewContainerRef.clear();
const componentRef = viewContainerRef.createComponent(componentFactory);
componentRef.changeDetectorRef.detectChanges();
return componentRef.instance;
}
這對我來說重要的是能夠給detectChanges()
一旦組件已創建。我嘗試了各種排列但沒有工作。有任何想法嗎?
如果我使用散列選擇器,則const viewContainerRef = componentHost.viewContainerRef;
返回null。
顯示你的代碼如何插入組件。和爲什麼你使用指令,而不是像這樣的模板引用' ng-template>'''@ViewChild('component-host1',{read:ViewContainerRef})componentHost: ComponentHost; ' –
@Maximus我在https://angular.io/guide/dynamic-component-loader上查看了食譜。我的代碼幾乎完全相同。 – serlingpa