Поскольку я не могу найти возможность изменить templateUrl, мне нужно было создать компонент для каждого типа диалога, который мне был нужен. Недостатком этого было то, что он больше не был динамичным, но он соответствовал тому, для чего он мне нужен. И в основном вы можете использовать сервис для генерации типа необходимого компонента. К сожалению, использование динамической загрузки компонентов не было жизнеспособным решением из-за сложности его выполнения. Ниже приведен пример того, что я сделал.
Код компонента для модального диалогового окна по умолчанию:
import {Component, Input} from '@angular/core';
import {NgbModal, NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';
@Component({
selector: 'app-ngbd-modal-content',
template: `
<div class="modal-header">
<h3 class="font-32" style="padding-bottom: 0px">{{headerText}}</h3>
</div>
<div class="modal-body">
<p>{{bodyText}}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-dark" (click)="activeModal.close('Close click')">Close</button>
</div>
`,
styleUrls: ['./default-modal-dialog.component.scss']
})
export class DefaultModalDialogComponent {
@Input() bodyText;
@Input() headerText;
constructor(public activeModal: NgbActiveModal) {}
}
Код компонента для FeaturedSearch:
import {Component, Input} from '@angular/core';
import {NgbModal, NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';
@Component({
selector: 'app-featured-search-dialog',
template: `
<div>
<div class="modal-header">
<h3 class="font-32" style="margin-bottom: -16px;">Edit Heading and Subheading</h3>
</div>
<div class="modal-body" style="padding:30px;">
<div class="row">
<div class="col-md-12">
<label class="font-14-bold">Heading</label>
</div>
</div>
<div class="row">
<div class="col-md-12">
<input style="box-shadow: rgb(102, 102, 102) 0px 0px 4px inset; border: 0px; margin-bottom: 50px;" type="text" class="form-control input-sm" ng-model="modalOptions.okResult.heading" >
</div>
</div>
<div class="row">
<div class="col-md-12">
<label class="font-14-bold">Subheading</label>
</div>
</div>
<div class="row">
<div class="col-md-12">
<input style="box-shadow: rgb(102, 102, 102) 0px 0px 4px inset; border: 0px;" type="text" class="form-control input-sm" ng-model="modalOptions.okResult.subheading" >
</div>
</div>
</div>
<div class="modal-footer">
<div style="margin-top: 8px; margin-bottom: 8px;">
<button style="background-color: #999999; color: #ffffff;" type="button" ng-show="modalOptions.okResult.buttonText !== 'Close'"
class="btn font-14-bold"
data-ng-click="modalOptions.close()">Close
</button>
<button style="background-color: #004065; color: #ffffff; width: 70px;" type="button" class="btn ng-binding" ng-disabled="modalOptions.okResult.heading.length <= 0 || modalOptions.okResult.subheading.length <=0" data-ng-click="modalOptions.ok()">OK</button>
</div>
</div>
</div>
`,
styleUrls: ['./featured-search-dialog.component.scss']
})
export class FeaturedSearchDialogComponent {
@Input() heading;
@Input() subheading;
constructor(public activeModal: NgbActiveModal) {}
}
Пользовательские модальные услуги:
import { Injectable, Input, ComponentFactoryResolver } from '@angular/core';
import {NgbModal, NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';
@Injectable()
export class ModalService {
constructor(private ngbModal: NgbModal,
private componentFactoryResolver: ComponentFactoryResolver) {}
showDefaultModalComponent(theComponent: any, headerText: any, bodyText: any) {
const componenetFactory = this.componentFactoryResolver.resolveComponentFactory(theComponent);
const modalRef = this.ngbModal.open(theComponent);
modalRef.componentInstance.bodyText = bodyText;
modalRef.componentInstance.headerText = headerText;
return modalRef;
}
showFeaturedDialog(theComponent: any, heading: any, subheading: any) {
const componenetFactory = this.componentFactoryResolver.resolveComponentFactory(theComponent);
const modalRef = this.ngbModal.open(theComponent);
return modalRef;
}
}