Динамическая компиляция и рендеринг существующих компонентов с Angular 5

У меня есть угловое приложение 1.x, которое работает с динамическим макетом. Приложение получает макет JSON с метаданными экрана и просто генерирует скомпилированные компоненты на лету и создает экран.

Соответствующий "важный код" выглядит так:

const element = this.$compile(`<${this.control.type} control="control" data="data"></${this.control.type}>`)(scope);
this.$element.replaceWith(element);

Теперь я пытаюсь перенести это в Angular 5 и понял, что Angular 5 отбросил манипулирование DOM и функциональность $compile.

Я искал все вокруг и нашел решения, которые знают, как визуализировать динамический HTML (например, {{1+1}}) и другие устаревшие материалы (до Angular 5), но не смогли найти подходящее для рендеринга динамически созданных компонентов (и обработка их внутренних привязок).

Есть ли способ, которым я могу достичь такой функциональности

1 ответ

Это способ создать компонент самостоятельно, как angularJS: (Не забудьте уничтожить его! Вызовите destroy() для componentRef, чтобы сделать это)

Родительский компонент:

@ViewChild('componentHolder', { read: ViewContainerRef }) componentHolder: ViewContainerRef;

constructor(private componentFactoryResolver: ComponentFactoryResolver) { }
public createComponent(): void {
          const componentFactory = this.componentFactoryResolver.resolveComponentFactory(MyComponent);
          const componentRef = this.componentHolder.createComponent(componentFactory);
}

Родительский компонент HTML:

<button (click)="createComponent()">Add New MyComponent below</button>
<div #componentHolder ></div>

Добавьте MyComponent в NgModule:

...
  imports: [
    BrowserModule,
    FormsModule,
    RouterModule.forRoot(appRoutes),
  ],
  entryComponents: [
    MyComponent
  ],...
Другие вопросы по тегам