Скажем, у меня есть ValuesComponent
, который отображает массив Value
в таблице HTML.
// in value.ts
export class Value { ... }
// in values.component.ts
@Component(...)
export class ValuesComponent { ... }
Будучи хорошим программистом и все, я создал другой класс, который отвечает за предоставление ценностей. Позвольте называть его ValuesService
.
// in values.service.ts
@Injectable()
export class ValuesService
{
public getValues(): Observable<Value[]>
{
...
}
}
Предположим, что служба получает свои значения из веб-службы: /api/values
Теперь вместо того, чтобы вводить службу непосредственно в мой компонент, я хочу, чтобы маршрутизатор Angular предварительно задал значения перед переходом на компонент.
Для этого я создал класс службы Resolve
и подключил его к модулю маршрутизатора.
// in values-resolver.service.ts
export class ValuesResolverService implements Resolve<Value[]> {
constructor(private backend: ValuesService) {
}
public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Value[]> {
return this.backend.getValues();
}
}
// In app.module.ts (in @NgModule())
imports: [
RouterModule.forRoot([{
path: 'values',
component: ValuesComponent,
resolve: { values: ValuesResolverService }
}])
]
// In values.component.ts
public values: Value[];
constructor(private route: ActivatedRoute) {
}
ngOnInit() {
this.values = route.data.values as Value[];
}
Как я это делаю до сих пор? Хорошо? Затем, где я могу поместить свою обработку ошибок, когда ValuesService.getValues()
завершается с ошибкой? (ошибка подключения, внутренняя ошибка сервера,...)
Когда пользователь пытается перейти к маршруту /#/values
и возникает ошибка, я хочу зарегистрировать ошибку на консоли и остановить навигацию. В идеале я бы перенаправил пользователя на маршрут /#/error
(не показано в примере кода).