2017-09-04 49 views
1

我想爲同一個組件使用多個路由而不需要重新實例化。Angular 2 - 沒有重新實例化的同一個組件的多個路由?

實施例路線:

[ 
    { path: 'test/:p1', component:component }, 
    { path: 'test/:p1/:p2', component:component }, 
    { path: 'test/:p1/:p2/:p3', component:component } 
] 

在i路徑分量之間切換被重新實例化和旋轉變壓器再運行。我提醒說不要使用查詢參數。 Optional Parameters for angular2 routes #12347

任何想法:

我的情況下,在這個問題上恰恰說明?我需要使用查詢參數嗎?

我的解析器代碼:

@Injectable() 
export class MyResolver implements Resolve<MyObject[]> { 

    constructor(private myService: MyService) {} 

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<MyObject[]> { 
    return this.myService.getData(route.params.id); 
    } 

} 
+0

什麼用解析器的問題被再次運行?是關於一些HTTP請求再次被觸發的嗎? 在這個問題上似乎沒有任何更新,所以我相信只有解決方法可以找到這個解決方案呢。 你可以做的是在你的解析器中監視當前路由/下一個被激活的路由,以便在你已經從包含你的組件的路徑出來時不會觸發請求。這可能是一個解決方案 –

+0

即使我從一個包含我的組件的路徑重新實例化(我的解析器獲取http請求)。 – Jarek

+0

你可以顯示你的解析器代碼和組件構造函數/ ngOnInit嗎? –

回答

0

這樣不是工作?它更是一個解決辦法不能真正解決問題的,但是這是我能拿出最好的:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<MyObject[]> | null { 
    if (route.includes('test')) { 
    return null; 
    } 

    return this.myService.getData(route.params.id); 
} 

然後你也可以在你的組件,你避免的情況下,做任何事情你解析器返回null管理這種情況下, 。使用

+0

非常感謝您的想法,但我正在尋找最佳實踐。現在我重新設計了路線架構,並且很少有共享數據的路由子項。 – Jarek

+0

要麼這是一個真正的複雜案例,要麼存在底層的體系結構問題......我認爲除解決方案中的問題之外,您不能做其他任何事情。 另一種解決方案是存儲HTTP請求的可觀察性以再次提供服務(從而避免在可用時重新進行呼叫)。你的下一個問題是管理何時清除這個存儲的observable來實際更新所獲取的數據。 –

+0

當我有路線的孩子數據不會再次解決時,我改變兒童路線,只有當我初始化父母。 – Jarek

0

解決方法一URLMatcher

const routes: Routes = [{ 
    matcher: urlSegments => 
    urlSegments[0] && urlSegments[0].path === 'test' ? { 
     consumed: urlSegments, 
     posParams: { 
     ...urlSegments[1] && {p1: urlSegments[1]}, 
     ...urlSegments[2] && {p2: urlSegments[2]}, 
     ...urlSegments[3] && {p3: urlSegments[3]} 
     } 
    } : 
    null, 
    component: component 
}]; 
相關問題