【问题标题】:Angular2 : How to refresh resolver dependent components?Angular2:如何刷新解析器依赖的组件?
【发布时间】:2017-04-21 10:14:31
【问题描述】:

我有三个组件,每个组件都有自己的解析器,可以从不同的 API 获取数据。 为此,这些组件依赖于一个 url,该 url 使用服务在它们之间共享。

我希望当该 url 发生更改时,每个组件都会自行重新加载,即重新启动解析器。

我查看了几个相关的 S.O 问题,但没有提到在使用解析器时如何这样做,参见:question 1,question 2,question 3

我可以想到两种方法:

肮脏的方式:使用路由器重定向和空白组件强制刷新组件。

this.router.navigateByUrl('blank',true);
this.router.navigateByUrl('home/(mapps:mobil//sw:simil//sf:sales)');

但这没有用。有一次刷新,但解析器没有……解决。

另一种方式:使用 BehaviorSubject 或 ChangeDetectorRef。 但是,我对如何实现它一无所知,考虑到检测组件中的更改并不能帮助我真正重新启动解析器。

我的感觉是这必须通过路由器以某种方式完成,因为它知道解析器:

const routes: Routes = [
  {
    path: '',
    redirectTo: 'home',
    pathMatch: 'full'
  },
  {
    path: 'home',
    component: HomeComponent,
    children : [
      {
        path: '',
        component: BlankComponent
      },
      {
        path: 'simil',
        component: SwComponent,
        outlet: 'sw',
        resolve: {
          data: SwResolve
        }
      },
      {
        path: 'sales',
        component: SalesComponent,
        outlet: 'sf',
        resolve: {
          data: SalesResolve
        }
      }
    ]
  },
  {
    path: 'blank',
    component: BlankComponent
  }
];

关于如何实现这一点的任何提示?

编辑:这是related plunkr

编辑 6 月 17 日: 不再需要空白组件解决方法。 要刷新组件,只需回调路由即可:

this.router.navigateByUrl('home/(mapps:mobil//sw:simil//sf:sales)')

【问题讨论】:

  • 请提供有关您如何使用解析器的详细信息和MCVE。当路由注入为ActivatedRoute(不是ActivatedRouteSnapshot)时,可以订阅data,就像显示here一样。
  • @estus 添加了详细的 plunkr。链接演示了我已经在使用的 ActivatedRouteSnapshot 的使用。
  • 好的,我明白了。应该刷新解析器的重定向应该发生在哪里?
  • @estus 更新了 plunk。这是我正在做的事情的简化版本,但你应该明白。
  • 是同一个子路由,所以路由组件没有更新,解析器也不会再次运行。如果它不同(相同的路由但不同的参数),则不会更新路由组件,但解析器将运行,并且可以订阅 ActivatedRoute data observable。这里的问题是错误地选择了责任点。在这里使用解析器是没有意义的,因为它们无论如何都引用共享服务。直接使用共享服务即可。共享服务中的 RxJS 主题有助于使 url 更改可订阅。

标签: angular typescript angular2-routing


【解决方案1】:

目前无法刷新路线。 with RouteReuseStrategy in Angular 2.3 可能会这样做。

当路线改变时会重新评估解析器,并且可以从ActivatedRoute 观察到。如果路线保持不变(没有更改参数),则不会重新评估它们,并且应该进行相应的设计。

路由更改是异步的,解决方法是链接路由更改:

this.router.navigateByUrl('blank').then(() => {
  this.router.navigateByUrl('home/(mapps:mobil//sw:simil//sf:sales)');
})

【讨论】:

  • 谢谢,终于成功了!由于没有注意到路由更改是异步的,我应该得到一张脸。似乎这是迄今为止最简单的解决方案,因为我的解析器不采用任何路由参数。
【解决方案2】:

使用 Angular 5 或更高版本可以重新运行 GuardsAndResolvers

来自official documentation

默认情况下它们仅在路由的矩阵参数时运行 改变。当设置为 paramsOrQueryParamsChange 他们也将运行时 查询参数改变。当设置为始终时,它们将每次运行。

{
   path: 'some path',
   runGuardsAndResolvers: 'paramsOrQueryParamsChange'
   ...
}

这应该重新运行守卫和解析器。

【讨论】:

猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 2015-04-09
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多