2016-12-06 49 views
7

我有三个组件,每个都有自己的解析器,可以从不同的API获取数据。 为此,这些组件依赖于使用服务在它们之间共享的url。Angular2:如何刷新解析程序相关组件?

我希望当这个URL发生变化时,每个组件都会重新加载自己,即重新启动解析器。

我看了一下几个相关的SO问题,但没有提及如何做到这一点使用的解析器,CF时:question 1question 2question 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)')

+1

请,你如何使用解析器提供的细节和[MCVE(http://stackoverflow.com/help/mcve)。当一个路由被注入为'ActivatedRoute'(而不是'ActivatedRouteSnapshot')时,'data'可以被订阅,就像它在[这里]显示的那样(https://angular.io/docs/ts/latest/guide/router.html #!#获取数据前方的导航)。 – estus

+0

@estus增加了详细的plunkr。 Link演示了我已经使用的ActivatedRouteSnapshot的用法。 – Stanislasdrg

+0

好吧,我明白了。在这个庞然大物中应该发生一个应该刷新解析器的重定向? – estus

回答

9

这是目前无法刷新的路线。它可能会做到这一点with RouteReuseStrategy in Angular 2.3

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

路线的变化是异步的,解决方法是连锁路线的变化:

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

谢谢,它终于奏效!我值得一个facepalm,因为不知道路由改变是异步的。看起来这是迄今为止最简单的解决方案,因为我的解析器不采用任何路由参数。 – Stanislasdrg

+0

不客气,很高兴这个作品 – estus