Angular4在导航路由解析之前获取数据
我尝试在激活路由之前使用角度路由解析获取组件数据 我看到的所有示例都在服务中调用一个方法并返回,我在服务中有5个不同的方法需要调用b4组件被激活 下面是我试图实现的示例,ContactService有3个方法都需要调用-如何在一次调用中返回所有3个方法 欢迎指点 Contact-Resolver.ts-如下所示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 '
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如果一个或多个服务调用失败会发生什么?@AnuradhagausekaraforkJoin
不会发出任何东西。如果一个或多个服务调用失败会发生什么事?@AnuradhagausekaraforkJoin
不会发出任何东西。