2016-03-22 13 views
6

子コンポーネントのルート変更を検出するにはどうすればよいですか。 これは私が試したことですが、アプリコンポーネントがルート変更をトレースするだけです。 URLがいつ変更されたかを検出することができます。 MetaDetailViewコンポーネントの#/ meta/a/b/cから#/ meta/a/b/c/dに移動します。角度2.0、子コンポーネントのルート変更を検出する方法

@RouteConfig([ 
    { path: '/', name: 'Home', redirectTo: ['Meta']}, 
    { path: '/meta/...', name: 'Meta', component: MetaMainComponent, useAsDefault: true}, 
    ...other routes..., 
    ])  
export class AppComponent { 
    constructor(private _router: Router) { 
     _router.subscribe((url) => console.log("app.url = " + url)); 
    } 
} 

@RouteConfig([ 
    { path: '/*other', name: 'Detail', component: MetaDetailViewComponent, useAsDefault: true}, 
]) 
export class MetaMainComponent { 
    constructor(private _router: Router) { 
     _router.subscribe((url) => console.log("metamain.url = " + url)); 
     console.log("MetaMainComponent") 
    } 
} 

export class MetaDetailViewComponent { 
    constructor(private _router: Router) { 
     _router.subscribe((url) => console.log("metadetail.url = " + url)); 
     console.log("MetaDetailViewComponent") 
    } 
} 

おかげ ジェスパー

答えて

3

routerに加入するグローバルなサービスを作成し、ルート変更について知りたいところはどこでもサービスを注入。サービスはObservableによって変更を公開することができるので、関心のあるコンポーネントも購読して自動的に通知を受けることができます。

+0

働くかもしれない(今日後でそれをしようとします)が、それは直接動作しない理由を任意のアイデアをルータとは? –

+0

私はルーティングに参加しているコンポーネントに適切な 'Router'インスタンスを注入するだけです。あなたが試みることができるのは '_router.root.subscribe(...)'です。 –

+0

私は、このように、観測可能なグローバルサービスを提案して使用することしかできませんでした。子コンポーネントのルーターに直接購読できない理由はまだ分かりません。 この記事では、観測可能なサービスを追加する方法について説明しました。 https://coryrylan.com/blog/angular-2-observable-data-services –

3

あなたはどの子ルータからのルートアクセスがあります。

_router.root.subscribe(route => console.log('route', route)); 
+0

と_router変数 –

+0

@RavinderPayalにアクセスするには、RouteConfig定義を持つコンポーネントに注入する必要があります。あなたはコンストラクタコンストラクタ(private _router:Router)にそれを注入することができます。後はthis._router – igorzg

+0

を介してコンポーネントのどこにでもアクセスできます。私はそれを試しました。そのコメントから、ルータ変数はもはや加入可能です –

6

RC3 +ソリューション:

constructor(private router: Router) { 
    this.router.events.subscribe(event => { 
    if (event.constructor.name === 'NavigationStart') { 
     console.log(event.url); 
    } 
    }); 
} 
+0

RC4で動作していません: –

+4

' 'this.router.events.subscribe(イベント=> { NavigationStartのinstanceof(イベントの場合){ にconsole.log(event.url); }});' ' 角度」からNavigationStartをインポートすることを忘れないでください/ルータ " –

関連する問題