Angular 2 route with parameters re-initializing component onInit

前端 未结 2 1286
醉梦人生
醉梦人生 2021-01-18 12:45

I have an issue where my component is re-initializing when I route to it with new parameters. Here are my routes.

const appRoutes: Routes = [
  { path: \'\'         


        
相关标签:
2条回答
  • 2021-01-18 13:27

    Routing back to the component with parameters re-initializes the component and repeats the service call.

    That is because the new route where you go is specified as a different route in your application. For the component not to be reinitialized, it has to be the same route.

    I see different possibilities here, depending on your specific scenario:

    If you only load /tiles to make a service call and then route to tiles/:master/:filters, but /tiles component doesn't make sense without receiving this data, you could consider using a resolver to make the API call, and then having only tiles/:master/:filters route.

    From the official docs, you can do the service call inside the resolver:

    @Injectable()
    export class MasterFiltersResolver implements Resolve<MasterFilter> {
      constructor(private cs: MasterFiltersService, private router: Router) {}
      resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<Crisis> {
        let id = route.params['id'];
        return this.cs.getData(id).then(data => {
          if (data) {
            return data;
          }
        });
      }
    }
    

    Then in your route you can specify it as:

    { path: '', component: MyNewComponentComponent },
    { path: 'tiles/:master/:filters', component: DisplayTileData, 
        resolve: {
            masterFilters: MasterFilterResolver
        } 
    } 
    

    This way, it will retrieve the data you need before loading your component.

    If your /tiles route component makes sense as a standalone component without master and filters data:

    In this case, you can use optional parameters.

    When having optional parameters, you would have only this route on your route definition

    { path: '', component: MyNewComponentComponent },
    { path: 'tiles', component: DisplayTileData }
    

    And then navigating to this route through router.navigate('/tiles', {master: '', filter: ''}.

    In this case, your component will need something like:

    constructor(private route: ActivatedRoute) {}
    
    this.route.params.subscribe(params => {
      // do something
    });
    

    this.route.params is an observable of params, so you can be reactive to any change to do async operations.

    0 讨论(0)
  • 2021-01-18 13:42

    I used a different approach, listening to the Activated route in my Component

    import { ActivatedRoute } from '@angular/router';
    
    constructor(
    private route: ActivatedRoute
    ) {
      this.route.url.subscribe(url =>{
          /* Your function*/
      });
    }
    
    0 讨论(0)
提交回复
热议问题