【发布时间】:2022-11-02 02:00:06
【问题描述】:
我有一个 Angular 路由解析器,其中包含在我的父路由加载时加载的项目列表,例如 /users。我已经实现了一个或多或少看起来像这样的 Angular 解析器:
export class UsersResolver implements Resolve<UsersResponse> {
constructor(private usersService: UsersService) {}
resolve(): Observable<UsersResponse> {
return this.usersService.getUsers();
}
}
子组件以标准方式使用解析器数据:
this.route.data.subscribe((data) => {const users = data['users']} )
这很好......直到我执行任何可能更改该列表的操作(添加/删除/更改用户)。在这种情况下,我希望该解析器重新运行。好吧,更具体地说,我希望解析器返回的数据能够反映更新后的数据。我不认为runGuardsAndResolvers 上的静态选项可以解决问题,在我的情况下,我也不认为使用可以交给runGuardsAndResolvers 的功能对我来说也行得通,因为这些数据更改可能不会发生与路线变更相一致。
我想我想要的是这样的:
export class UsersResolver implements Resolve<UsersResponse> {
constructor(private usersService: UsersService) {}
resolve(): Observable<UsersResponse> {
return this.usersService.users$;
}
}
...其中this.usersService.users$ 是一个rxjs Subject。这意味着我可以通过其他方式更新该主题,并且(我认为)解析器中的数据会更新,因此订阅该解析器的任何子组件都会得到更新。但如果这是正确的,那么我在哪里触发初始数据提取,以及如何确保我的解析器在初始数据提取完成之前不会真正解析?
这是一个合理解决方案的常见问题,还是我以错误的方式解决这个问题?
【问题讨论】:
标签: angular rxjs angular-resolver