Resolve
Интерфейс, который классы могут реализовать, чтобы служить поставщиком данных. Класс — поставщик данных можно использовать с маршрутизатором для разрешения данных во время навигации. Интерфейс определяет метод resolve(), который вызывается сразу после события маршрутизатора ResolveStart. Маршрутизатор ожидает разрешения данных, прежде чем окончательно активировать маршрут.
API
interface Resolve<T> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): MaybeAsync<T | RedirectCommand>;
}
resolve
MaybeAsync<T | RedirectCommand>MaybeAsync<T | RedirectCommand>
Описание
Интерфейс, который классы могут реализовать, чтобы служить поставщиком данных. Класс — поставщик данных можно использовать с маршрутизатором для разрешения данных во время навигации. Интерфейс определяет метод resolve(), который вызывается сразу после события маршрутизатора ResolveStart. Маршрутизатор ожидает разрешения данных, прежде чем окончательно активировать маршрут.
В следующем примере реализуется метод resolve(), который получает данные, необходимые для активации запрошенного маршрута.
@Injectable({ providedIn: 'root' })
export class HeroResolver implements Resolve<Hero> {
private readonly service = inject(HeroService);
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<Hero>|Promise<Hero>|Hero {
return this.service.getHero(route.paramMap.get('id'));
}
}
Здесь определённая функция resolve() передаётся как часть объекта Route в конфигурации маршрутизатора:
@NgModule({
imports: [
RouterModule.forRoot([
{
path: 'detail/:id',
component: HeroDetailComponent,
resolve: {
hero: HeroResolver
}
}
])
],
exports: [RouterModule]
})
export class AppRoutingModule {}
А получить доступ к разрешённым данным можно из HeroComponent:
@Component({
selector: "app-hero",
templateUrl: "hero.component.html",
})
export class HeroComponent {
private readonly activatedRoute = inject(ActivatedRoute);
ngOnInit() {
this.activatedRoute.data.subscribe(({ hero }) => {
// do something with your resolved data ...
})
}
}
Примечания по использованию
Если указаны и защитники, и резолверы, резолверы запускаются только после выполнения и успешного завершения всех защитников. Например, рассмотрим следующую конфигурацию маршрута:
{
path: 'base'
canActivate: [BaseGuard],
resolve: {data: BaseDataResolver}
children: [
{
path: 'child',
guards: [ChildGuard],
component: ChildComponent,
resolve: {childData: ChildDataResolver}
}
]
}
Порядок выполнения: BaseGuard, ChildGuard, BaseDataResolver, ChildDataResolver.
Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/api/router/Resolve