这是我的一个解析器的错误处理示例,使用了 Gunter 建议的技术:
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/observable/of';
import { IProduct } from './product';
import { ProductService } from './product.service';
@Injectable()
export class ProductResolver implements Resolve<IProduct> {
constructor(private productService: ProductService,
private router: Router) { }
resolve(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<IProduct> {
let id = route.params['id'];
if (isNaN(+id)) {
console.log(`Product id was not a number: ${id}`);
this.router.navigate(['/products']);
return Observable.of(null);
}
return this.productService.getProduct(+id)
.map(product => {
if (product) {
return product;
}
console.log(`Product was not found: ${id}`);
this.router.navigate(['/products']);
return null;
})
.catch(error => {
console.log(`Retrieval error: ${error}`);
this.router.navigate(['/products']);
return Observable.of(null);
});
}
}
您可以在这里找到完整的示例:https://github.com/DeborahK/Angular-Routing https://github.com/DeborahK/Angular-Routing在 APM-final 文件夹中。
2019 年 2 月更新
这是解析器中错误处理的更好答案:
- 使用可选的错误属性将您的接口包装在另一个接口中:
/* Defines the product entity */
export interface Product {
id: number;
productName: string;
productCode: string;
category: string;
tags?: string[];
releaseDate: string;
price: number;
description: string;
starRating: number;
imageUrl: string;
}
export interface ProductResolved {
product: Product;
error?: any;
}
- 解析到该接口:
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable, of } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { ProductResolved } from './product';
import { ProductService } from './product.service';
@Injectable({
providedIn: 'root',
})
export class ProductResolver implements Resolve<ProductResolved> {
constructor(private productService: ProductService) {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<ProductResolved> {
const id = route.paramMap.get('id');
if (isNaN(+id)) {
const message = `Product id was not a number: ${id}`;
console.error(message);
return of({ product: null, error: message });
}
return this.productService.getProduct(+id).pipe(
map((product) => ({ product: product })),
catchError((error) => {
const message = `Retrieval error: ${error}`;
console.error(message);
return of({ product: null, error: message });
}),
);
}
}
- 在组件中,拉出您需要的接口部分:
ngOnInit(): void {
const resolvedData: ProductResolved = this.route.snapshot.data['resolvedData'];
this.errorMessage = resolvedData.error;
this.product = resolvedData.product;
}