我想知道在 Angular 5 中加载数据的最佳方法是什么。当然,我们希望让组件保持沉默;)现在,我正在使用解析器,Angular 在特定路由中调用解析器。基本上,数据是在组件初始化之前加载的,因此我可以向用户显示加载器动画。
例如。
AResolver.resolver.ts
@Injectable()
export class AResolver implements Resolve<any> {
constructor(private readonly aService: AService) {}
resolve(route: ActivatedRouteSnapshot) {
return this.aService.find(route.paramMap.get('id'));
}
}
模块.ts
export const MRoutes: Routes = [
{
path: 'route-x',
component: AComponent,
resolve: AResolver
}
];
AComponent.component.ts
@Component({
selector: 'a-super-fancy-name',
})
export class AComponent {
constructor(private readonly route: ActivatedRoute) {}
}
好吧,到目前为止一切都很好,但是:
- 如果我有具有依赖关系的解析器怎么办?那么,要解析 B,我们需要来自 A 的 id 吗?我应该使用解析器包装器吗?因此我做了类似的事情:
例子
@Injectable()
export class ABResolver implements Resolve<any> {
constructor(private readonly aService: AService, private readonly bService: BService) {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.aService.resolve(route, state).map((result) => this.bService.resolveWithId(result.Id));
}
}
我想这是最好的方法,因为我们仍然有 2 个可以重用的独立解析器。一般来说,为所有需要数据的组件或只为依赖于其他解析器的解析器制作解析器包装器是一种好习惯,还是根本不应该使用解析器包装器?
解析器中的其他方法(如
resolveWithId
)呢?在
AResolver
route.paramMap 中用于获取 id。传递 id 不是更好吗,因为这看起来是紧密耦合的?有哪些替代方案?
我使用的方法有什么缺点?