ngx bootstrap 通过路由打开模式
ngx bootstrap open modal via routing
我有一个当前可用的 ngx bootstrap 模式,它会打开一个详细信息列表页面,其中包含我的每个列表的特定数据。但是,我想使用路由,以便可以通过直接 url 打开我的列表模式,并根据它的 ID 填充列表特定详细信息。例如 .../listings/listing/50 将打开列表模式并填充列表 ID 50 的详细信息。
此时我什至无法通过直接 url 打开任何模式。
目前我正在通过 link 单击
打开每个模式
<a (click)="openDetailsModal(listing)" ...
和我的 ListingService
openDetailsModal(listing: Listing): void {
this.selectedListing = listing;
this.bsModalRef = this.modalService.show(ListingDetailComponent, {class:'listingDetailModal'});
this.bsModalRef.content.listing = this.selectedListing;
}
此外,我目前也在使用 HttpClient
从我的数据库中获取所有列表
您可以在这种情况下使用标准 bootstrap 模态。将模态标记添加到您的组件,然后通过路由加载它。我已将 "show" class 添加到模式中,以便它会立即显示。确保您的父组件上有一个路由器插座。 Here is a demo on Stackblitz.
您的列表模态组件将如下所示:
import { Component, Input, Output, EventEmitter, AfterViewInit } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'listing-dialog',
template: `
<div id="backdrop" class="modal-backdrop fade" [ngClass]="{ show: showModal }"></div>
<div class="modal d-block fade"
[ngClass]="{ show: showModal }"
(click)="onClose()"
id="listing-dialog"
tabindex="-1" role="dialog" aria-labelledby="modalIdLabel">
<div class="modal-dialog" role="document" (click)="onDialogClick($event)">
<div class="modal-content">
<div class="modal-header">
<h5>I was loaded via route</h5>
<button type="button"
class="close"
(click)="onClose()"
aria-label="Close"><span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>Add some detail here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" (click)="onClose()">Close</button>
</div>
</div>
</div>
</div>
`
})
export class ListingDialogComponent implements AfterViewInit {
showModal = false;
constructor(private router: Router) { }
ngAfterViewInit() {
this.showModal = true;
}
onClose() {
this.showModal = false;
//Allow fade out animation to play before navigating back
setTimeout(
() => this.router.navigate(['..']),
100
);
}
onDialogClick(event: UIEvent) {
// Capture click on dialog and prevent it from bubbling to the modal background.
event.stopPropagation();
event.cancelBubble = true;
}
}
您的托管组件应该是这样的:
<a [routerLink]="['listing']" >Load Listing</a>
<router-outlet></router-outlet>
模块需要注册路由:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { ListingDialogComponent } from './listing-dialog.component';
const routes: Routes = [
{ path: 'listing', component: ListingDialogComponent }
]
@NgModule({
imports: [ BrowserModule, FormsModule, RouterModule.forRoot(routes) ],
declarations: [ AppComponent, HelloComponent, ListingDialogComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
我没有在演示中包含参数,但您可以轻松地在模态中观察它们,然后执行任何必要的服务调用来填充模态。我在我的应用程序中的很多地方都使用了这种方法。
我有一个当前可用的 ngx bootstrap 模式,它会打开一个详细信息列表页面,其中包含我的每个列表的特定数据。但是,我想使用路由,以便可以通过直接 url 打开我的列表模式,并根据它的 ID 填充列表特定详细信息。例如 .../listings/listing/50 将打开列表模式并填充列表 ID 50 的详细信息。
此时我什至无法通过直接 url 打开任何模式。
目前我正在通过 link 单击
打开每个模式<a (click)="openDetailsModal(listing)" ...
和我的 ListingService
openDetailsModal(listing: Listing): void {
this.selectedListing = listing;
this.bsModalRef = this.modalService.show(ListingDetailComponent, {class:'listingDetailModal'});
this.bsModalRef.content.listing = this.selectedListing;
}
此外,我目前也在使用 HttpClient
从我的数据库中获取所有列表您可以在这种情况下使用标准 bootstrap 模态。将模态标记添加到您的组件,然后通过路由加载它。我已将 "show" class 添加到模式中,以便它会立即显示。确保您的父组件上有一个路由器插座。 Here is a demo on Stackblitz.
您的列表模态组件将如下所示:
import { Component, Input, Output, EventEmitter, AfterViewInit } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'listing-dialog',
template: `
<div id="backdrop" class="modal-backdrop fade" [ngClass]="{ show: showModal }"></div>
<div class="modal d-block fade"
[ngClass]="{ show: showModal }"
(click)="onClose()"
id="listing-dialog"
tabindex="-1" role="dialog" aria-labelledby="modalIdLabel">
<div class="modal-dialog" role="document" (click)="onDialogClick($event)">
<div class="modal-content">
<div class="modal-header">
<h5>I was loaded via route</h5>
<button type="button"
class="close"
(click)="onClose()"
aria-label="Close"><span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>Add some detail here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" (click)="onClose()">Close</button>
</div>
</div>
</div>
</div>
`
})
export class ListingDialogComponent implements AfterViewInit {
showModal = false;
constructor(private router: Router) { }
ngAfterViewInit() {
this.showModal = true;
}
onClose() {
this.showModal = false;
//Allow fade out animation to play before navigating back
setTimeout(
() => this.router.navigate(['..']),
100
);
}
onDialogClick(event: UIEvent) {
// Capture click on dialog and prevent it from bubbling to the modal background.
event.stopPropagation();
event.cancelBubble = true;
}
}
您的托管组件应该是这样的:
<a [routerLink]="['listing']" >Load Listing</a>
<router-outlet></router-outlet>
模块需要注册路由:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { ListingDialogComponent } from './listing-dialog.component';
const routes: Routes = [
{ path: 'listing', component: ListingDialogComponent }
]
@NgModule({
imports: [ BrowserModule, FormsModule, RouterModule.forRoot(routes) ],
declarations: [ AppComponent, HelloComponent, ListingDialogComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
我没有在演示中包含参数,但您可以轻松地在模态中观察它们,然后执行任何必要的服务调用来填充模态。我在我的应用程序中的很多地方都使用了这种方法。