【发布时间】:2019-03-08 10:41:49
【问题描述】:
我正在开发 Angular 6 应用程序。我有从数据库加载动态路由的要求。所以为了实现这一点,我注入了 Routes 服务类 (DynamicRoutingService),它负责从数据库加载静态和动态路由并添加 app.module.ts --> RouterModule.forRoot(RouteCollection)。
在 DynamicRoutingService 类中,我使用 subscribe 方法加载数据,我的问题是请求 url 的页面在 subscribe 方法获取 http 结果之前呈现,因此应用程序抛出无效路由错误。
我遇到过使用 resolve 和 promise 来解决这个问题,但不确定我是否确实这样做了,这就是我需要帮助的地方
应用路由解析器
Injectable()
export class AppRoutingResolver implements Resolve<any>{
constructor(
private router: Router
){}
resolve(route: ActivatedRouteSnapshot):Promise<any> | boolean{
return false;
}
}
app.component
export class AppComponent {
constructor(private routingService:DynamicRoutingService){
routingService.initializeDynamicRoutes(); // call service to reload routes
}
}
app.routing.module
@NgModule({
imports: [
RouterModule.forRoot(RouteCollection)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {
constructor(
private router:Router
) {
}
}
动态路由服务
@Injectable({
providedIn: 'root'
})
export class DynamicRoutingService {
private dynamicRoutes: Route[] = [];
private waitToLoadRoutes: boolean = true;
private dynamicRoutesData: any;
private routeObject: any;
routeSubject: string = "survey";
static forEach: any;
constructor(
private router: Router,
private dynamicRoutesDataServices: DynamicRoutesDataServices
) { }
public initializeDynamicRoutes() {
this.loadDynamicRoutes();
}
public loadDynamicRoutes(): Route[] {
//LOADING DATA FROM DATABASE
this.dynamicRoutesDataServices.GetDynamicRoutesCollection(this.routeSubject)
.subscribe((result: any) => {
if (result) {
this.dynamicRoutesData = result
if (this.dynamicRoutesData) {
this.assembleDynamicRoutes();
}
}
});
return this.dynamicRoutes;
}
DataService调用http查询
export class DynamicRoutesDataServices{
constructor(
private getDynamicRoutesQuery:GetDynamicRoutesQuery
){}
public GetDynamicRoutesCollection(routesSubject: string): any{
this.getDynamicRoutesQuery.initialise(routesSubject);
var result = this.getDynamicRoutesQuery.execute();
return result;
}
}
Http Query 调用 API
@Injectable()
export class GetDynamicRoutesQuery extends BaseQuery<any>
{
private data:any;
public initialise(dynamicRouteSubject:string): void{
this.method = RequestMethod.Post;
if(dynamicRouteSubject){
this.data = {
RouteSubject: dynamicRouteSubject
}
}
this.setBody(this.data);
super.setEndPoint(`myside/GetDynamicRoutes`);
}
}
【问题讨论】:
标签: angular typescript angular-routing