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.
I believe there is an issue with Scott's answer where he uses the ActivatedRoute inside the constructor of the service. This route won't get updated.
I thought of another solution which might peek your interest. It again comes down on using the data property on the routes, but now using another resolve service:
You are going to need a RouterConfig like this, where for each route you add the state: StateResolve and a data object containing the state name:
const routes: RouterConfig = [{
path: 'queue/:date/:offset/:type',
component: BundleListComponent,
resolve: {
response: BundleListResolve,
state: StateResolve
},
data: {
state: 'Bundle'
},
...
]
don't forget to add the StateResolve service to the providers array
Your StateResolve service will look something like this:
@Injectable()
export class StateResolve implements Resolve {
constructor(private stateService: StateService) {}
resolve(route: ActivatedRouteSnapshot): string {
let state: string = route.data['state']
this.stateService.setState(state);
return state;
}
}
Obviously you will need a StateService which has the setState method, but I guess from here it's pretty self-explanatory.
Perhaps using a resolve guard is a bit eccentric, but if you think about it, you are trying to resolve data before you show the route. In this case, the state inside the data variable, so it does make sense to use the Resolve to access the data property