Что вы можете сделать, это:
Когда вы вызываете компонент A, вы передаете ему шаблон ng следующим образом:
<app-component-a>
<ng-template *ngIf=”condition; else elseBlock”>
<app-component-b></app-component-b>
</ng-template>
<ng-template #elseBlock>
<app-component-c></app-component-c>
</ng-template>
</app-component-a>
Теперь в вашем app-component-a.ts вы делаете это:
@ContentChild(TemplateRef) template: TemplateRef;
Таким образом, в основном шаблон получит компонент b или c в зависимости от вашего состояния.
И затем в компоненте A вы делаете это:
<ng-container [ngTemplateOutlet]="template"></ng-container>
Так что теперь ваш ng-контейнер получит Компонент B или C в зависимости от вашего состояния.
Что касается вашей формы, я боюсь, что единственное, о чем я могу думать, - это создать сервис и предоставить его в компоненте A, внедрить его в A, B и C и поделиться формой в этом сервисе.
Но если вы включите компоненты B и C, как я показал выше, Angular самостоятельно обработает создание и уничтожение ваших компонентов B и C.
В противном случае при изменении условия вашего ng-шаблона ваш компонент B не будет уничтожен при создании экземпляра компонента C.
Edit:
Еще одна вещь, о которой я могу подумать, это то, что, если вы не вызываете компонент B или C, как только создается экземпляр A, вы также можете передать (@Output) форму из A в родительский oninit A. Это так, когда B или вызывается C, родитель A будет иметь доступ к форме и может передать ее B или C.