Angular4在导航路由解析之前获取数据

Angular4在导航路由解析之前获取数据,angular,rxjs,angular5,angular4-router,Angular,Rxjs,Angular5,Angular4 Router,我尝试在激活路由之前使用角度路由解析获取组件数据 我看到的所有示例都在服务中调用一个方法并返回,我在服务中有5个不同的方法需要调用b4组件被激活 下面是我试图实现的示例,ContactService有3个方法都需要调用-如何在一次调用中返回所有3个方法 欢迎指点 Contact-Resolver.ts-如下所示 import { Injectable } from '@angular/core'; import { Resolve, ActivatedRouteSnapshot } from '

我尝试在激活路由之前使用角度路由解析获取组件数据

我看到的所有示例都在服务中调用一个方法并返回,我在服务中有5个不同的方法需要调用b4组件被激活

下面是我试图实现的示例,ContactService有3个方法都需要调用-如何在一次调用中返回所有3个方法

欢迎指点

Contact-Resolver.ts-如下所示

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { ContactsService } from './contacts.service';

@Injectable()
export class ContactResolve implements Resolve<Contact>
{

  constructor(private contactsService: ContactsService) {}

  resolve(route: ActivatedRouteSnapshot)
  {
    return this.contactsService.getContact(route.paramMap.get('id')); //method in Service
  }

//  return this.contactsService.getCities(); //Another method in Service that also needs to be called

 // return this.contactsService.getAllParts(); //Another method in Service that also needs to be called


}
从'@angular/core'导入{Injectable};
从'@angular/router'导入{Resolve,ActivatedRouteSnapshot};
从“/contacts.service”导入{ContactsService};
@可注射()
导出类ContactResolve实现解析
{
构造函数(私有contactsService:contactsService){}
解析(路由:ActivatedRouteSnapshot)
{
返回此.contactsService.getContact(route.paramMap.get('id');//服务中的方法
}
//返回此.contactsService.getCities();//服务中还需要调用的另一个方法
//返回此.contactsService.getAllParts();//服务中还需要调用的另一个方法
}

您可以只使用
forkJoin
,它将等待所有源观测完成:

resolve(route: ActivatedRouteSnapshot) {
  return Observable.forkJoin(
    this.contactsService.getContact(route.paramMap.get('id')),
    this.contactsService.getCities(),
    this.contactsService.getAllParts()
  );
}

所有结果将在一个包含3个项目的数组中可用。

您可以只使用
forkJoin
等待所有源观测完成:

resolve(route: ActivatedRouteSnapshot) {
  return Observable.forkJoin(
    this.contactsService.getContact(route.paramMap.get('id')),
    this.contactsService.getCities(),
    this.contactsService.getAllParts()
  );
}

所有结果将在一个包含3项的数组中可用。

解析界面定义如下:

interface Resolve<T> {
  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> | Promise<T> | T
}
接口解析{
解析(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺| T
}
方法
resolve
可以返回
Observable
Promise
,或者只是某种类型的对象。在您的情况下,您应该在
ContactService
中订阅联系人、城市和部件。在那里接收到所有三条数据后,将它们组合到一个对象中,并以单独的方法返回,例如,
getCombinedData
,您可以从解析器调用该方法


另一个选项是按照martin的建议使用RxJS
forkJoin
,但是如果您想准备一个具有组合结果的结构化对象,请手动执行。

解析接口定义如下:

interface Resolve<T> {
  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> | Promise<T> | T
}
接口解析{
解析(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺| T
}
方法
resolve
可以返回
Observable
Promise
,或者只是某种类型的对象。在您的情况下,您应该在
ContactService
中订阅联系人、城市和部件。在那里接收到所有三条数据后,将它们组合到一个对象中,并以单独的方法返回,例如,
getCombinedData
,您可以从解析器调用该方法


另一种选择是按照martin的建议使用RxJS
forkJoin
,但是如果您想准备一个具有组合结果的结构化对象,请手动执行。

这些方法返回什么?可观察的?@martin是的,它们返回可观察的结果。方法返回什么?Observables?@martin Yes他们返回Observables如果一个或多个服务调用失败会发生什么?@Anuradhagausekara
forkJoin
不会发出任何东西。如果一个或多个服务调用失败会发生什么事?@Anuradhagausekara
forkJoin
不会发出任何东西。