在 Angular2 中,如何在应用程序路由呈现页面之前使用 resolve 和 promise 等待从服务器加载数据
In Angular2, how to use resolve and promise to wait data load from server before app route render page
我正在处理 Angular 6 应用程序。我需要从数据库加载动态路由。所以为了实现这一点,我注入了路由服务 class (DynamicRoutingService),它负责从数据库加载静态和动态路由并添加 app.module.ts --> RouterModule.forRoot(RouteCollection).
在 DynamicRoutingService class 中,我正在使用 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 查询 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 中的解析器是为指定路由预取数据的助手。
示例 1:
RouterModule.forRoot([
{
path: 'team/:id',
component: TeamComponent,
resolve: {
team: TeamResolver
}
}
])
解析器将团队 属性 中的团队信息存储在 ActivatedRoute 数据 属性 中。所以你需要把它附加到现有的路线上。
https://angular.io/api/router/Resolve
https://codeburst.io/understanding-resolvers-in-angular-736e9db71267
我正在处理 Angular 6 应用程序。我需要从数据库加载动态路由。所以为了实现这一点,我注入了路由服务 class (DynamicRoutingService),它负责从数据库加载静态和动态路由并添加 app.module.ts --> RouterModule.forRoot(RouteCollection).
在 DynamicRoutingService class 中,我正在使用 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 查询 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 中的解析器是为指定路由预取数据的助手。
示例 1:
RouterModule.forRoot([
{
path: 'team/:id',
component: TeamComponent,
resolve: {
team: TeamResolver
}
}
])
解析器将团队 属性 中的团队信息存储在 ActivatedRoute 数据 属性 中。所以你需要把它附加到现有的路线上。
https://angular.io/api/router/Resolve
https://codeburst.io/understanding-resolvers-in-angular-736e9db71267