给出以下路由:
path: '',
component: MyComponent,
resolve: {
foo: FooResolver,
bar: BarResolver
}
有没有办法告诉Angular先执行第一个解析器FooResolver
,只有在第一个解析器完成后再执行第二个解析器BarResolver
?
给出以下路由:
path: '',
component: MyComponent,
resolve: {
foo: FooResolver,
bar: BarResolver
}
有没有办法告诉Angular先执行第一个解析器FooResolver
,只有在第一个解析器完成后再执行第二个解析器BarResolver
?
解析器会并行解析。如果Foo
和Bar
应该按顺序解析,它们应该成为单个FooBar
解析器。如果它们应该在其他路由中单独使用,FooBar
可以包装Foo
和Bar
解析器:
class FooBarResolver implements Resolve<{ foo: any, bar: any }> {
constructor(
protected fooResolver: FooResolver,
protected barResolver: BarResolver
) {}
async resolve(route): Promise<{ foo: any, bar: any }> {
const foo = await this.fooResolver.resolve(route);
const bar = await this.barResolver.resolve(route);
return { foo, bar };
}
}
FooBar
需要知道Foo
和Bar
返回的是Promise还是Observable以便正确解决它们,否则需要添加额外的安全措施,例如await Observable.from(this.fooResolver.resolve(route)).toPromise()
。
FooBar
和Foo
或Bar
不应出现在同一路由中,因为这会导致重复解析。
resolve: { fooBar: FooBarResolver }
,并且解析后的数据可以通过 activatedRoute.data['fooBar'].foo
等方式在路由组件中使用。 - Estus Flaskclass FooBarResolver implements Resolve<Observable<any>> {
constructor(
protected fooResolver: FooResolver,
protected barResolver: BarResolver
) { }
resolve(): Observable<any>
{
return this.fooResolver.resolve().pipe(
concat(this.barResolver.resolve()),
concat(this.barResolver.resolve())
);
}
}
{ path: '', resolve: { foo$: FooResolver }, children: [
{ path: 'mySubRoute', resolve: {bar$: BarResolver }, component: BarComponent }
]}
如果您遇到相对路径解析问题,请尝试使用
relativeLinkResolution: "corrected"
在 forRoot 路由方法中。更多信息请参见 具有空路径的组件中的 Angular RouterLink 相对路径无法正常工作
我使用单个resolver
中的combineLatest
解决了这种情况。你可以这样做:
@Injectable({providedIn: 'root'})
export class FooBarResolver implements Resolve<any> {
constructor(
private readonly fooResolver: FooResolver,
private readonly barResolver: BarResolver
) {}
resolve() {
return combineLatest(
this.fooResolver.resolve(),
this.barResolver.resolve()
).pipe(map(([users, posts]) => ({users, posts})))
}
}
foo
和bar
是什么以及为什么它们应该按此顺序解析。但通常可以使用 FooBarResolver 来实现,该解析器会解析出一个包含 foo 和 bar 的对象。 - Estus Flaskfoo
和bar
是从数据库检索出来的 JSON 对象,我不关心执行顺序,但它们必须一个接一个地执行。 - Ivan Aguilarbar
和baz
依赖于foo
,但在某些路由中,baz
是可选的。最终,我创建了一个名为FooBarBaz
的解析器,它处理了可选的baz
。据我所知,目前没有更好的方法。 - Estus Flask