2016-08-31 120 views
0

導航到孩子的路線後,我有我的路線設置如下所示:角2 RC5路由設置,重定向到根從代碼

const routes: Routes = [ 
...CoreRoutes, 
{ path: 'error', component: ErrorPage}, 
{ path: 'login', component: LoginPage}, 
{ path: '', redirectTo: 'app/dashboard', pathMatch: 'full'}, 
{ path: '**', redirectTo: 'app/dashboard'}, 
]; 

與子路由(CoreRoutes)爲:

export const CoreRoutes: Routes = [{ 
path: 'app', 
component: Core, 
children: [ 
    { path: 'dashboard', component: Dashboard}, 
    { path: 'another-page', component: AnotherPage}, 
    { path: 'maps-vector', component: MapsVector}, 
    { path: 'discuss1', component: Discuss1}, 
    { path: 'profile', component: Profile}, 
    { path: 'discuss2', component: Discuss2}, 
    { path: 'grid', component: Grid}, 
    { path: 'service/:service', component: DynamoComponent}, 
    { path: 'dynamo', component: DynamoComponent}, 
    { path: 'tables/dynamic', component: TablesDynamic} 
] 

}];

當我開始它重定向到「應用程序/儀表盤」正確的應用程序,但是,當我瀏覽使用代碼從我的發電機觀點

this.router.navigate(['app/service/', encodedParams]); 

到應用程序/服務:服務我可以看到它要正確路由(並實例化組件,但是在它的NavigationEnd之後,它會重定向到默認的「應用/儀表板」,我只能假設它正在回落到默認路由,但無法弄清楚爲什麼它會這樣做)

如果我嘗試在重定向後第二次訪問應用程序/服務:服務,它可以工作。

如果我從應用程序路線中刪除默認路線,它會正常工作,但我沒有得到默認路線的好處。

我知道這可能是一件簡單的事情,因爲我最近纔開始使用angular 2,但我在這方面一直在打我的頭很久,爲什麼這條路線表現不佳並選擇默認值當它成功加載子路由時的路由。

無其他途徑都有這樣的問題,雖然這一條路徑是在ONY一個我使用代碼導航時,別人都在用routerlinks他們

頁這是我登錄到控制檯的信息從顯示成功後,找到正確的路線應用程序/服務

Angular 2 is running in the development mode. Call enableProdMode() to enable the production mode. 
core.ts:246navigation end id: 1 url:/
core.ts:243 navigation start id: 2 url: /app/dynamo 
core.ts:240 navigation routerecognized id: 2 url: /app/dynamo 
core.ts:246 navigation end id: 2 url: /app/dynamo 
core.ts:243 navigation start id: 3 url: /app/service/%257B... 
core.ts:240 navigation routerecognized id: 3 url: /app/service/%257B... 
core.ts:246 navigation end id: 3 url: /app/service/%257B. 
core.ts:243 navigation start id: 4 url:/
core.ts:240 navigation routerecognized id: 4 url:/
core.ts:246 navigation end id: 4 url:/
+0

什麼是'encodedParams'是它的一些對象還是一個字符串數? –

+0

這是一個encodedUrlComponent字符串,它充當參數 –

+0

我還提到,如果我直接打開應用程序到 /應用程序/服務/(encodedParams) 在瀏覽器中的URL作爲初始url它能正常工作 –

回答

0

你缺少在導航斜槓重定向到「/」導航事件。

this.router.navigate(['/app/service/', encodedParams]); 

通知斜槓/app/service/ -> /app/service/

希望這有助於!

+0

我試過以同樣的方式,無論哪種方式都有問題。首次訪問重定向,第二次訪問和成功。 –

+0

我已經調試到第二個錯誤的導航訂閱到router.navigate的時候,但還沒有能夠找出發送額外導航的源。我假設它是在路線和解,但還沒有更深入。我希望有更多經驗的人可以提供比我通過路由協調代碼更快更簡單的方法。 –

+0

路由的URL是什麼?你能爲這個問題創建一個簡單的Plunker嗎? –

0

我不知道我是否找到了根本問題,但我找到了一種解決方法,但卻沒有真正理解它的工作原理。

在DynamoComponent中,它調用數據服務,緩存這些結果,爲該數據生成模板,然後使用該模板生成組件並傳入請求的數據。我在想也許它的原始和子組件之間的數據填充緩存對象的某種類型的數據同步問題?我正在使用一個我寫的MemoryStorage類(由SessionStorage,LocalStorage和NoStorage類並行),我描述的異常是在應用程序中使用緩存服務(在保護全局訪問的父對象上)爲了緩存遠程數據的結果,第一次通過它應該從服務中獲取數據,隨後它應該從內存緩存中獲取數據。即使最初使用默認值進入頁面'/ service'並且沒有任何參數可以工作,但下一次使用參數進行的調用並沒有發生,儘管以下所有內容都是在第一次之後進行的。

@Injectable() 
export class MemoryStorage { 

    private cached_data: { [key: string]: any } = {}; 

    constructor() { 
    } 

    public getItem(key: string) { 
    return this.cached_data[key]; 
    } 


    public setItem(key: string, value: any) { 
    this.cached_data[key] = value; 
    } 

    public clear(key?: string){ 
    if (key) 
     delete this.cached_data[key]; 
    else 
     this.cached_data = {}; 
    } 
} 

,我發現是使用會話或本地存儲,儘管爲什麼我的MemoryStore的可能有同步問題的任何指針將不勝感激,因爲我不能總是依賴於會話或本地存儲的解決方法。

另外我真的不知道爲什麼這會導致路由轉到根路由而不會產生任何錯誤。雖然在使用LocalStorage或SessionStorage時沒有做到這一點,但我已經驗證過,儘管在每次需要數據時進行服務調用時仍會使用NoCache同步問題。