Похоже, вам нужен компонент промежуточного программного обеспечения для визуализации экземпляров других компонентов.
это может быть этот
@Component({
selector: 'ng-somehow-render',
template: '',
})
export class NgSomehowRenderComponent implements OnInit {
@Input() instance: any;
constructor (
private cfr: ComponentFactoryResolver,
private vcr: ViewContainerRef,
private cdr: ChangeDetectorRef,
) {
}
public ngOnInit(): void {
const componentFactory = this.cfr.resolveComponentFactory(this.instance.constructor);
this.vcr.clear();
const componentRef = this.vcr.createComponent(componentFactory);
for (const key of Object.getOwnPropertyNames(this.instance)) {
componentRef.instance[key] = this.instance[key];
}
this.cdr.detectChanges();
}
}
Просто добавьте его объявление в ваши модули.
Кстати, компонент Greeting
должен быть объявлен в ваших модулях в entryComponents
.
@NgModule({
declarations: [AppComponent, Greeting, NgSomehowRenderComponent],
imports: [BrowserModule],
providers: [],
bootstrap: [AppComponent],
entryComponents: [Greeting]
})
Поскольку Angular попытается решить зависимости конструктора, вам нужно добавить декоратор @Optional()
.
@Component({
template: `hello {{ who }}`
})
export class Greeting {
constructor(@Optional() public who: string) {}
}
прибыль.
Вы можете посмотреть живую демонстрацию здесь: https://codesandbox.io/s/jolly-villani-32m5w?file= / src / app / app.component.ts
Все вещи из официальное сделать c, так что вы можете использовать его без проблем: https://angular.io/guide/dynamic-component-loader#resolving -компоненты