Angular 2 shared service to pass data to component-to-component

后端 未结 3 466
南旧
南旧 2021-01-16 12:20

I am trying to pass the string value of this.title from my LandingPage.component to my ResultPage.component.

I retrieve the list.show value

3条回答
  •  佛祖请我去吃肉
    2021-01-16 13:07

    Separation of concerns... Your landing page is used to select the list item and navigate to the result page. Let it do just that and only that. Let the ResultPage.component do the rest. Note: Other answers recommend storing the value of the last title in the TitleService. It's not a good idea to store state in a service. Then TitleService cannot be used as a generic way to get any title separate from your current navigation, without side effects.

    Remove (click) event. Add 'show' as a QueryParam.

    landingpage.component.html

  • {{list.show}}
  • Subscribe to router params and queryparams to get the id and show.

    resultpage.component.ts

    import { Component, OnInit, OnDestroy } from '@angular/core';
    import { ActivatedRoute, Router } from '@angular/router';
    import { TitleService } from '../../services/title.service';
    
    @Component({
      ...
    })
    export class ResultPageComponent implements OnInit, OnDestroy {
    
     itemId: string;
     show: string;
     subParams: any;       // infinite Observable to be unsubscribed
     subQueryParams: any;  // infinite Observable to be unsubscribed
    
     constructor(
              ... 
              private TitleService: TitleService,
              protected route: ActivatedRoute,
              protected router: Router,
              ...
     ) {}
    
     ngOnInit() {
       this.subParams = this.route.params.subscribe(this.onParams);
       this.subQueryParams = this.route.queryParams(this.onQueryParams);
     }
    
     ngOnDestroy() {
       // Delete active subscribes on destroy
       this.subParams.unsubscribe();  
       this.subQueryParams.unsubscribe();  
     }
    
     onParams = (params: any) => {
       this.itemId = params['id'];
     }
    
     onQueryParams = (data: any) => {
      this.show = data.show;
      if(this.show) {
        this.TitleService.fetchTitle(this.show)
      }
     }
    

提交回复
热议问题