Angular ng-bootstrap Модальное открытие не поддерживает TemplateRef
, поскольку пользовательский компонент передается из шаблона.
Изначально я ожидал использовать Modal примерно так:
this.modalService.open(ModalWindowComponent, {
body: EmployeeFormComponent,
title: 'Employee',
data: {
age: 28
}
});
сШаблон ModalWindowComponent
такой:
<div class="modal-dialog">
<div class="modal-header">
<h4 class="modal-title">{{modal.title}}</h4>
<button type="button" class="close" aria-label="Close" (click)="modal.close()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<ng-template [ngTemplateOutlet]="modal.body">
<!-- example: <app-employee-form></app-employee-form> -->
</ng-template>
</div>
</div>
Но потом я понял, что это невозможно, или требует сверхсложной логики с созданием динамических компонентов.Итак, я решил использовать рекомендованный шаблонно-управляемый подход, имея модальный шаблон в шаблоне компонента.Но так как мне нужно собственное тело, я создал ModalWindowComponent
с этим шаблоном:
<ng-template>
<div class="modal-header">
<h4 class="modal-title">{{title}}</h4>
<button type="button" class="close" aria-label="Close" (click)="ref.dismiss()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<ng-content></ng-content>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" (click)="ref.close()">Cancel</button>
</div>
</ng-template>
Я ожидал использовать его следующим образом:
template
<button type="button" class="btn btn-primary" (click)="open(modal)">Open</button>
<app-modal-window [ref]="modal" [title]="'Title'" #modal>
Body
</app-modal-window>
компонент
open(modal: NgbModalRef): void {
this.modalService.open(modal).result.then((result: any) => {
this.closeResult = `Closed with: ${result}`;
}, (reason: any) => {
this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
}
Но я вижу эту ошибку: Не найдена фабрика компонентов для [объекта Object].Вы добавили его в @ NgModule.entryComponents? Я пытался исправить это, добавив ModalWindowComponent
к entryComponents
соответствующего модуля, но это не помогло.
Однако это работает:
<button type="button" class="btn btn-primary" (click)="open(modal)">Open</button>
<ng-template #modal let-c="close" let-d="dismiss">
<div class="modal-header">
<h4 class="modal-title">Title</h4>
<button type="button" class="close" aria-label="Close" (click)="d()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
Body
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" (click)="c()">Cancel</button>
</div>
</ng-template>
Итак, вопрос в том, что я делаю не так?Может быть, есть лучший способ добиться желаемого поведения?Я понимаю, что Modal не поддерживает управляемый классом пользовательский компонент тела, но мне кажется, что я не могу заставить работать также управляемые шаблонами.
Демо: https://angular -v6amvy.stackblitz.io
Версии пакета:
Угловой: 6.0.0
ng-bootstrap: 2.1.2
Bootstrap: 4.1.1
PS Я также взглянул на https://valor -software.com / ngx-bootstrap / # / modals и https://material.angular.io/components/dialog/overview, но похоже, что они также не поддерживают необходимое поведение.