2016-11-29 13 views
5

mam skonfigurować trasy jest jak poniżejJak uzyskać aktualne dane niestandardowe trasy w kanciastym 2?

const appRoutes: Routes = [ 
    { 
    path: 'login', 
    component: LoginComponent, 
    data: { 
     title: 'Login TTX' 
    } 
    }, 
    { 
    path: 'list', 
    component: ListingComponent, 
    data: { 
     title: ' TTX Home Page', 
     module:'list' 
    } 
    }, 
    { 
    path: '', 
    redirectTo: '/login', 
    pathMatch: 'full' 
    }, 
]; 

Teraz, kiedy przychodzą do '/list' trasie następnie na 'listing.component.ts' Pisałem poniżej kod

export class ListingComponent { 

    public constructor(private router:Router) { 
     //here how i can get **data** of **list** routes 

    } 
} 
+0

wygląda jak dup z http://stackoverflow.com/questions/38644314/changing-the-page-title-using -the-angle-2-new-router/38652281 # 38652281 –

Odpowiedz

3
public constructor(private route:ActivatedRoute, private router:Router) { 
     console.log(route.snapshot.data['title']); 
    } 
+2

Problem polega na tym, że ta trasa nie jest potrzebna do ostatecznej trasy, jest zagnieżdżonym drzewem. To naprawdę zależy od tego, gdzie umieścisz ten utwór, a następnie po prostu zagraj tutaj. – windmaomao

+1

Nie zawsze da to poprawne wyniki, ponieważ zależy od miejsca, w którym je umieszczasz. – asmmahmud

+0

W prawo, jeśli nie dodasz go do komponentu, który został dodany przez bieżącą trasę, musisz przejść przez drzewo routera, aby uzyskać pożądany segment, aby uzyskać dostęp do danych. –

1

Po testowałem różne rozwiązania, kątowe Odpowiedź grupy wsparcia faktycznie rozwiązała ten problem ładnie.

ActivatedRoute doesn't carry data, a tu jest rozwiązanie do wykrywania zmiennej strony w ramach data: { page: 'login' }.

import { Router, RoutesRecognized } from '@angular/router'; 

export class AppComponent { 
    page = ''; 
    constructor(private router: Router) { 
    // listen to page variable from router events 
    router.events.subscribe(event => { 
     if (event instanceof RoutesRecognized) { 
     let route = event.state.root.firstChild; 
     this.page = 'page-' + route.data.page || ''; 
     console.log('Page', this.page); 
     } 
    }); 
    } 
} 
10

kątowego 4+

Jeśli umieścić następujący kod w macierzystym lub poziom górny komponentów takich jak AppComponent to nie będzie działać. To działa tylko na dzieci lub niższy poziom składników, dla których już zdefiniowane dane niestandardowej trasy:

public constructor(private route:ActivatedRoute, private router:Router) { 
     console.log(route.snapshot.data['title']); 
    } 

Tak więc, jeśli chcesz uzyskać dostęp do danych niestandardowych trasa globalnie od składnika dominującego lub poziom górny, aby uzyskać dostęp do zmiany w niestandardowych danych trasy musisz słuchać zdarzeń routera, w szczególności zdarzeń RoutesRecognized lub NavigationEnd. Pokażę dwie procedury z AppComponent z dwóch zdarzeń:

Pierwsze podejście:

export class AppComponent implements OnInit, AfterViewInit { 

    constructor(private activatedRoute: ActivatedRoute, private router: Router) { } 

    ngOnInit() { 
     this.router 
     .events 
     .filter(event => event instanceof NavigationEnd) 
     .map(() => { 
      let child = this.activatedRoute.firstChild; 
      while (child) { 
      if (child.firstChild) { 
       child = child.firstChild; 
      } else if (child.snapshot.data && child.snapshot.data['custom_data']) { 
       return child.snapshot.data['custom_data']; 
      } else { 
       return null; 
      } 
      } 
      return null; 
     }).subscribe((customData: any) => { 
      console.log(customData); 
     }); 
    } 
} 

Drugie podejście wykorzystuje:

this.router.events 
.filter(event => event instanceof RoutesRecognized) 
.map((event: RoutesRecognized) => { 
    return event.state.root.firstChild.data['custom_data']; 
}) 
.subscribe(customData => { 
    console.log(customData); 
}); 

Uwaga: Chociaż ostatnia jeden jest krótszy i zwykle działa, ale jeśli masz zagnieżdżone trasy, zachęcamy do skorzystania z pierwszego.

+0

Świetnie, twoje pierwsze podejście bardzo pomogło. Dziękuję Ci! Dla pozostałych: Musisz importować "rxjs/add/operator/filter" i "rxjs/add/operator/map", aby działało –

0

ten pracował dla mnie w app.component.ts (ng 5)

constructor(
    private router: Router, 
) { 

router.events.subscribe((routerEvent: Event) => { 
     this.checkRouterEvent(routerEvent); 
    }); 
} 

checkRouterEvent(routerEvent: Event): void { 
    if (routerEvent instanceof ActivationStart) { 
     if (routerEvent.snapshot.data.custom_data) { 
      this.currentpage = routerEvent.snapshot.data['custom_data']; 
      console.log('4.' + this.currentpage); 
     } 

    } 
Powiązane problemy