2017-05-28 59 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: [ 
     ...