【发布时间】:2018-12-06 16:08:28
【问题描述】:
我想知道在 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'));
}
}
M.module.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)呢?在
AResolverroute.paramMap 中用于获取id。传递 id 不是更好吗,因为这看起来是紧密耦合的?有哪些替代方案?
我使用的方法有哪些缺点?
【问题讨论】:
-
解析器可能会有所改进。但是由于(IMO)目前的巨大限制,我现在几乎从不使用它们。真的感觉它不能很好地与流和反应式应用程序一起玩。在此处查看更多信息stackoverflow.com/questions/49054232/… 我通常使用 ngrx,因此,我确实管理所有 HTTP 调用以使其生效。
标签: angular angular-router angular-resolver