В случае угловых, как правило, модал обычно создается как отдельный компонент многократного использования. Пожалуйста, возьмите следующий пример упаковки модального загрузчика для использования внутри Angular4 в качестве компонента. Аналогичный подход должен работать и для Angular5.
modal.component.html
<!-- Modal -->
<div class="modal fade" id="{{modalId}}" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static"
data-keyboard="false">
<div id = "setSize" class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<ng-content select="[modal-title]"></ng-content>
<button id="{{hideId}}" type="button" class="close" data-dismiss="modal" (click)="xClicked()" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<ng-content select="[modal-body]"></ng-content>
</div>
<div class="modal-footer" *ngIf="options.footer">
<ng-content select="[modal-footer]"></ng-content>
</div>
</div>
</div>
</div>
modal.component.ts
import { ModalOptions } from './modal-options';
import { Component, OnInit, OnChanges, Output, EventEmitter, Input } from '@angular/core';
@Component({
selector: 'modal-component',
templateUrl: './modal.component.html',
styleUrls: ['./modal.component.scss'],
inputs: ['toggle']
})
export class ModalComponent implements OnInit {
private toggle: EventEmitter<any>;
@Input() options: ModalOptions = new ModalOptions();
@Output() onModalClose = new EventEmitter<any>();
//ADDED TO ADJUST MODAL SIZE FOR TICKER COMPONENT
@Input() size: string;
public showId: string;
public hideId: string;
public modalId: string;
constructor() {
this.showId = this.randomId();
this.hideId = this.randomId();
this.modalId = this.randomId();
}
ngOnInit() {
if (this.size == 'large') {
document.getElementById('setSize').className = "modal-dialog modal-lg"
}
this.toggle.subscribe(e => {
if (e.toLowerCase() === 'show') {
document.getElementById(this.showId).click();
} else if (e.toLowerCase() === 'hide') {
document.getElementById(this.hideId).click();
}
//document.getElementById(this.id).click();
})
}
private randomId() {
let length = 5;
let chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
}
xClicked() {
this.onModalClose.emit();
}
}
modal.option.ts (просто некоторые функции, которые мне пришлось реализовать, не обязательно)
export class ModalOptions {
footer: boolean = true;
topClose: boolean = false;
}
Использование
some.component.html
<modal-component [toggle]="modal">
<div modal-body>
</div>
<!--footer-->
<div modal-footer>
</div>
</modal-component>
some.component.ts
export class SomeComponent{
public modal = new EventEmitter<any>();
public show(){ this.modal.emit("show"); }
public hide() { this.modal.emit("hide");}
}
Надеюсь, это поможет.