2016-03-22 8 views
6

Jak wykryć zmianę trasy elementu potomnego ?. To jest to, czego próbowałem, ale widzę tylko składnik aplikacji śledzący zmianę trasy. Chcę być w stanie wykryć, kiedy adres URL zmienia się z np. #/meta/a/b/c do #/meta/a/b/c/d w komponencie MetaDetailView.Angular 2.0, jak wykryć zmianę trasy na komponencie potomnym

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

Dzięki Jesper

Odpowiedz

3

Tworzenie globalną usługę zasubskrybuje router i wstrzyknąć usługę gdziekolwiek chcesz wiedzieć o zmianach trasy. Usługa może ujawnić zmiany przez samą siebie, więc zainteresowane komponenty mogą również subskrybować, aby otrzymywać powiadomienia automatycznie.

+0

To może działać (spróbuje później dzisiaj), ale jakiś pomysł dlaczego to nie działa bezpośrednio z routerem? –

+0

Myślę, że dostajesz tylko odpowiednią instancję 'Routera 'wstrzykiwaną na komponentach biorących udział w routingu. Możesz jednak spróbować użyć '_router.root.subscribe (...)'. –

+0

Udało mi się uzyskać tę funkcję przy użyciu możliwej do zaobserwowania usługi globalnej, zgodnie z sugestią. Nadal nie rozumiem, dlaczego nie mogę zasubskrybować bezpośrednio routera w komponencie potomnym. Znalazłem ten artykuł o dodawaniu obserwowalnej usługi. https://coryrylan.com/blog/angular-2-observable-data-services –

3

masz prawa dostępu użytkownika root z dowolnego routera dziecko:

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

i jak uzyskać dostęp do zmiennej _router –

+0

@RavinderPayal należy wprowadzić do komponentu, który ma definicję RouteConfig. Możesz go wprowadzić w konstruktorze konstruktora (prywatny _router: Router) i po nim jest dostępny w dowolnym miejscu twojego komponentu przez to._router – igorzg

+0

Tak, próbowałem tego i od tego komentarza chcę powiedzieć, że zmienna Routera nie jest już subskryfikowana –

6

RC3 + rozwiązania:

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

nie działa w RC4 :( –

+4

' 'this.router.events.subscribe (event => { jeśli (event instanceof NavigationStart) { console.log (event.url); } });' ' } nie zapomnij zaimportować elementu NavigationStart z" kątowego/router " –

Powiązane problemy