2017-05-28 64 views
5

考虑下面的路由配置:如何刷新路由的解决数据

const routes: Routes = [ 
    { 
    path: '', 
    component: AppComponent, 
    resolve: { 
     app: AppResolver 
    }, 
    children: [ 
     { 
     path: 'user/:uid', 
     resolve: { 
      user: UserResolver 
     }, 
     children: [ 
      { 
      path: '', 
      component: ViewUserComponent 
      }, 
      { 
      path: 'edit', 
      component: EditUserComponent 
      } 
     ] 
     } 
    ] 
    } 
]; 

数据由UserResolver路线/user/:uid的任何子女检索的用户。 使用此数据,用户配置文件可通过导航至/user/:uid进行查看,然后通过导航至/user/:uid/edit进行编辑。 编辑成功后,将会有人重定向到用户的已更新的配置文件(/user/:uid)。

但是,视图和编辑页面都是已解析路径的子项,解析器在从一个导航到另一个导航时不会被触发。

因此,从编辑组件导航回视图组件时,显示的数据仍然是旧的,未更新的。

会有什么办法来解决已解决的user数据强制解析器从服务器再次获取它吗?或者有没有其他方法可以实现这种结果?

app数据保持不变,我们不应该重新加载它。

+0

使用共享服务而不是父组件来处理数据。 –

+0

@HarryNinh我可以,但这意味着复制订阅路由参数的代码并在每个子组件中调用服务,同时在共享服务中重新实现缓存策略。这似乎破坏了路由解析器的目的。 – vlaurin

+0

很多关于这个问题的搜索。尽我所能地告诉解决这个问题的唯一方法是订阅一个事件并手动重新加载数据。理想情况下,你会构建应用程序。所以你可以通过代码重用来做到这一点,但即使这也是一个挑战,因为重新使用Resolve并不是微不足道的,因为获得路由器状态。我选择在Re​​solve中创建一个公用函数,可以重用并绕过解析函数本身。这是一个可以改进的明确领域。我看到很多人有这样的问题。 –

回答

3

有一个参数可以在路由配置中使用,名为'runGuardsAndResolvers',它会影响解析器运行的时间。在这种情况下,你会想将其设置为“始终”。这意味着解析器将在该路线的任何时候路线改变时运行。有关更多信息,请参见the route documentation

5

我测试了解决方案'runGuardsAndResolvers',它适用于我的用例,解析器在每个子页面更改时都会调用。

它只是添加这个选项,你想要这样的行为的路线部分。

export const ROUTES: any = [ 
    { 
    path: 'project/:name', 
    runGuardsAndResolvers: "always", 
    component: ProjectComponent, 
    resolve: { project: ProjectResolver }, 
    children: [ 
     ...