ngx bootstrap - вкладывает компонент в шаблон - PullRequest
0 голосов
/ 05 сентября 2018

У нас есть стандартный модал в нашем приложении.

<ng-template [ngIf]="true" #editDataModal>
   <div class="modal-header">
     <h5 class="modal-title">Edit Modal</h5>
     <button type="button" class="close" aria-label="Close" (click)="onCancelClicked()">
       <span aria-hidden="true">&times;</span>
     </button>
   </div>
  <div class="modal-body" #editDataModalBody>CUSTOM COMPONENT GOES HERE</div>
 </ng-template>

Мы хотим иметь возможность передавать пользовательский компонент как наше тело. Есть ли способ в загрузчике ngx сделать это?

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

Мы звоним, используя модальный сервис. Вот так: -

  constructor(
    private modalService: BsModalService
  ) { }

ngOnInit() {
   this.modalConfig = {
      ignoreBackdropClick: true
    };

   this.ModalRef = this.modalService.show(this.editModal, this.modalConfig);
}

1 Ответ

0 голосов
/ 07 сентября 2018

Модальный компонент может получить и опубликовать 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 и опубликовать его с помощью службы или подобного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...