Angular 2 - Check current active route “name”

后端 未结 6 1624
说谎
说谎 2020-12-24 09:36

I am having an Angular 2 application with several nested children view. But it will be displayed on the same page though several router-outlet.



        
6条回答
  •  滥情空心
    2020-12-24 10:00

    Create a service called ActiveState which will subscribe to changes to the router, using router.events.subscribe:

    import {Injectable} from "@angular/core";
    import {Router, ActivatedRoute, NavigationEnd} from "@angular/router";
    
    @Injectable()
    export class ActiveState {
    
      public name : string;
    
      constructor(router : Router, route : ActivatedRoute)
      {
        router.events.subscribe(event => {
          if(event instanceof NavigationEnd){
    
            // Traverse the active route tree
            var snapshot = route.snapshot;
            var activated = route.firstChild;
            if(activated != null) {
              while (activated != null) {
                snapshot = activated.snapshot;
                activated = activated.firstChild;
              }
            }
    
            // Try finding the 'stateName' from the data
            this.name = snapshot.data['stateName'] || "unnamed";
          }
        });
      }
    
      is(name : string) : boolean
      {
        return this.name === name;
      }
    }
    

    Then on your route we add a simple value on the data param of the route called stateName for each state we want to name:

    const routes: Routes = [
    {
        path: 'queue/:date/:offset/:type',
        component: BundleListComponent,
        resolve: { response: BundleListResolve }
        data: { stateName: 'Bundle' },
        children: [
            {
                path: ':bundleId', component: PointListComponent,
                resolve: { response: PointListResolve },
                data: { stateName: 'Point'}
            }
        ...
    

    Then when you inject state : ActiveState you can simple test the value state.is("Point")

提交回复
热议问题