【问题标题】:In Angular2, how to use resolve and promise to wait data load from server before app route render page在Angular2中,如何使用resolve和promise在应用程序路由渲染页面之前等待从服务器加载数据
【发布时间】: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


    【解决方案1】:

    我不确定您是否在此处使用正确的方法来加载动态路由。 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-13
      • 2017-01-14
      • 2011-06-10
      • 2020-12-24
      • 1970-01-01
      • 2017-03-07
      • 2016-06-09
      相关资源
      最近更新 更多