Контент проекта внутри проецируемого контента

У меня есть компонент динамической формы, который создает все поля формы из настраиваемого объекта. Эта форма может быть разделена на группы только по причинам ux.

Я пытаюсь реализовать возможность проецирования контейнера для этих групп из родительского компонента.

Я использую директиву контейнера, чтобы я мог проверить, существует ли контейнер, в противном случае я представляю различные поля каждой группы без контейнера.

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[container]',
})
export class ContainerDirective {
  @Input() name: string;

  constructor(public templateRef: TemplateRef<any>, public viewContainerRef: ViewContainerRef) {}
}

Я использую директиву в родительском компоненте так:

<moc-dynamic-form [dataSource]="formDataSource">
  <moc-card *container></moc-card>
</moc-dynamic-form>

Директива dataSource динамически создает различные поля формы, а динамическая форма получает проекцию контейнера, который я хочу использовать в качестве контейнера групп.

В компоненте динамической формы я получаю контейнер из директивы.

@ContentChild(ContainerDirective) container: ContainerDirective;

В шаблоне динамической формы я проверяю, существует ли контейнер, и в этом случае пытаюсь спроецировать поля каждой группы внутри контейнера.

<form [formGroup]="form">
    <div
      [class]="'p-grid ui-fluid p-formgrid p-align-start ' + ((options$ | async)?.formStyle || '')"
    >
      <ng-container *ngFor="let field of fields$ | async">
        <ng-container
          *ngTemplateOutlet="
            isGroup(field) ? groupContainerTemplate : fieldTemplate;
            context: { $implicit: field }
          "
        ></ng-container>
      </ng-container>
    </div>
  </form>
</div>


<ng-template #groupContainerTemplate let-containerField>
  <ng-container *ngIf="container">
    <ng-container *ngTemplateOutlet="container.templateRef">
      <ng-container
        *ngTemplateOutlet="groupTemplate; context: { $implicit: containerField }"
      ></ng-container>
    </ng-container>
  </ng-container>
  <ng-container *ngIf="!container">
    <ng-container
      *ngTemplateOutlet="groupTemplate; context: { $implicit: containerField }"
    ></ng-container>
  </ng-container>
</ng-template>

<ng-template #groupTemplate let-groupField>
  <!— I place here the fields of each group --!>
</ng-template>

Все работает нормально, за исключением того, что поля не отображаются (я вижу контейнеры). Я пробовал много обходных путей, создав в компоненте встроенное представление и передав туда groupTemplate. Но и это не дало мне никакого результата.

Любая помощь будет высоко оценен.

0 ответов

Другие вопросы по тегам