2016-03-22 6 views
6

Wie kann ich eine Routenänderung an einer untergeordneten Komponente erkennen ?. Dies ist, was ich versucht habe, aber ich sehe nur die App-Komponente die Route ändern. Ich möchte in der Lage zu erkennen, wenn die URL z. #/meta/a/b/c zu #/meta/a/b/c/d in der MetaDetailView-Komponente.Angular 2.0, Erkennen von Routenänderungen für untergeordnete Komponente

@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") 
    } 
} 

Dank Jesper

Antwort

3

einen globalen Service erstellen, der den Dienst zu router und injizieren abonniert, wo immer Sie Routenänderungen wissen wollen. Der Dienst kann Änderungen durch eine Observable selbst offen legen, so dass interessierte Komponenten auch abonnieren können, um automatisch benachrichtigt zu werden.

+0

die funktionieren könnte (es wird versuchen Sie es später noch heute), aber keine Ahnung, warum es nicht funktioniert direkt mit Router? –

+0

Ich denke, Sie erhalten nur eine richtige 'Router'-Instanz, die auf Komponenten injiziert wird, die am Routing teilnehmen. Was Sie jedoch versuchen könnten, ist '_router.rootsubscribe (...)'. –

+0

Ich konnte das nur mit einem beobachtbaren globalen Dienst wie vorgeschlagen erreichen. Immer noch nicht verstehen, warum ich nicht direkt den Router auf der untergeordneten Komponente abonnieren kann. Ich habe diesen Artikel darüber gefunden, wie man einen beobachtbaren Dienst hinzufügt. https://coryrylan.com/blog/angular-2-observable-data-services –

3

Sie haben Root-Zugriff von jedem Kind Router:

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

und wie auf _router Variable –

+0

@RavinderPayal zuzugreifen, müssen Sie in Ihre Komponente injizieren, die RouteConfig-Definition haben. Sie können es in Konstruktorkonstruktor (private _router: Router) injizieren und danach ist überall in Ihrer Komponente über this._router zugänglich – igorzg

+0

yeah ich habe das versucht und von diesem Kommentar möchte ich sagen, Router-Variable ist nicht mehr Subscribable –

6

RC3 + Lösung:

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

, die in RC4 nicht funktioniert :( –

+4

' 'this.router.events.subscribe (event => { if (Ereignisinstanz von NavigationStart) { console.log (event.url); } });' ' Vergessen Sie nicht, NavigationStart von" angular "zu importieren/Router " –

Verwandte Themen