【问题标题】:How to conditionally update Angular route resolver data?如何有条件地更新 Angular 路由解析器数据?
【发布时间】: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


    【解决方案1】:

    我认为您正在尝试一些不可能的事情。我的意思是resolverroute change 事件中将是triggered,因此如果您在resolver was completed 之后更改该可观察对象的某些内容,您将不会在组件中获得该信息。

    如果您想将该信息与您的组件同步,我建议您订阅或仅在您的组件中使用async pipe,而不是在您的resolver 中使用。

    如果您仍然想拥有您的 resolver,您可以合并两个 observables 并处理您的 component 中的更改

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2017-10-29
      • 2021-11-23
      • 2017-03-06
      相关资源
      最近更新 更多