Модальный компонент может получить и опубликовать ViewContainerRef. Например, он может использовать BehaviorSubject. Родительский компонент может создать пользовательский компонент и добавить его в модальное состояние при публикации viewContainerRef. Я сделал это только вместо получения, потому что ViewChild недействителен до afterViewInit, поэтому вам нужен способ справиться с этим.
// EditModalComponent
export class EditModalComponent implements AfterViewInit {
@ViewChild("editDataModalBody", {read: ViewContainerRef}) vc: ViewContainerRef;
public bodyRefSubject: BehaviorSubject<ViewContainerRef> = new BehaviorSubject<ViewContainerRef>(null);
constructor(
public bsModalRef: BsModalRef,
public vcRef: ViewContainerRef
) {}
ngAfterViewInit() {
this.bodyRefSubject.next(this.vc);
}
onCancelClicked() {
console.log('cancel clicked');
this.bsModalRef.hide()
}
}
А в родительском компоненте:
// Parent Component
export class AppComponent {
bsModalRef: BsModalRef;
bodyContainerRef: ViewContainerRef;
customComponentFactory: ComponentFactory<CustomComponent>;
modalConfig: ModalOptions;
constructor(
private modalService: BsModalService,
private resolver: ComponentFactoryResolver
) {
this.customComponentFactory = resolver.resolveComponentFactory(CustomComponent);
}
openModalWithComponent() {
this.modalConfig = {
ignoreBackdropClick: true,
}
this.bsModalRef = this.modalService.show(EditModalComponent, this.modalConfig);
this.bsModalRef.content.bodyRefSubject.subscribe((ref) => {
this.bodyContainerRef = ref;
if (this.bodyContainerRef) {
this.bodyContainerRef.createComponent(this.customComponentFactory);
}
})
}
}
Другой способ без использования ViewChild - это поместить директиву в div вместо #editDataModalBody, и эта директива может внедрить ViewContainerRef и опубликовать его с помощью службы или подобного.