Using named router-outlets, you can create a bootstrap modal fairly easily:
app.component.html
<router-outlet name="modal"></router-outlet>
modal.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'modal',
template: `
<div class="modal fade in show" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">Modal title</h4>
</div>
<div class="modal-body">
<p>One fine body…</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="modal-backdrop fade in"></div>
`
})
export class ModalComponent implements OnInit {
constructor() { }
ngOnInit() { }
}
app.module.ts
import { RouterModule } from '@angular/router';
import { ModalComponent } from './modal.component';
@NgModule({
imports: [
BrowserModule,
RouterModule.forRoot(
[{ path: 'open', component: ModalComponent, outlet: 'modal'}]
)
],
declarations: [ AppComponent, ModalComponent ],
bootstrap: [ AppComponent ],
exports: [AppComponent]
})
export class AppModule {
}
To trigger the modal, create a link:
<a [routerLink]="[{ outlets: { modal:'open' }}]">Click Me</a>
Or inject router and navigate to 'open':
constructor(private router: Router) {
}
openDialog() {
this.router.navigate([{ outlets: { modal:'open' }}]);
}
To close the dialog:
<a [routerLink]="[{ outlets: { modal:null }}]">Click Me</a>
Or
closeDialog() {
this.router.navigate([{ outlets: { modal: null }}]);
}