Angular как передать параметры во внедренную службу - PullRequest
0 голосов
/ 01 августа 2020

У меня есть служба данных (dataservice), которая получает данные на основе переданного параметра. Dataservice вводится во вторую службу (resultservice), которая будет вызывать методы службы данных для получения данных.

В моем angular компоненте я вставляю resultservice, но мне нужно передать ему параметр GroupId. Как правильно это сделать?

import { Injectable } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { DataService} from './data.service';

@Injectable({
  providedIn: 'root'
})
export class ResultService {

  protected groupId;
  private results$ = new Subject<any>();
  
  constructor(
    private dataService: DataService, 
    groupId: number
  ) { 
    this.dataService.getResults(groupId) //this groupId value is what I need to pass in from my component
      .subscribe(res => {
        this.results$.next(res);
      })
  }

  getResults(): Observable<any> {
    return this.results$.asObservable();
  }
}

Компонент

constructor(
    private activatedRoute: ActivatedRoute, 
    private competitiondata: CompetitionDataService,
    private platform: Platform,
    private resultService: ResultService
  ) { }

  ngOnInit() {
    this.activatedRoute.params.subscribe(params => 
      this.groupId = params['groupId']; //how do I pass this value to the ResultService so that it can be passed to the DataService???
      this.results = this.resultService.getResults();
    }

  }

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Если вам нужно получить результаты на основе параметра маршрута, правильный способ сделать это будет использовать службу разрешения .

Служба результатов:

import { Injectable } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { DataService } from './data.service';

@Injectable({
  providedIn: 'root'
})
export class ResultService {

  protected groupId;
  private results$ = new Subject<any>();
  
  constructor(
    private dataService: DataService
  ) { }

  getResults(): Observable<any> {
    return this.results$.asObservable();
  }

  initDataServiceWithNewGroupId(groupId) {
    this.groupId = groupId;
    return this.dataService.getResults(this.groupId)
      .pipe(
        tap(res => {
        this.results$.next(res);
      })
    )
  }
}

Resolver:

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { ResultService } from './result.service';


@Injectable({ providedIn: 'root' })
export class ResultsResolver implements Resolve<any> {
  constructor(private service: ResultService) {}

  resolve(
    route: ActivatedRouteSnapshot,
  ): Observable<any>|Promise<any>|any {
    const groupId = route.paramMap.get('groupId');
    return this.service.initDataServiceWithNewGroupId(groupId);
  }
}

Компонент:

export class HelloComponent implements OnInit  {
  groupId;
  results;

  constructor(
    private activatedRoute: ActivatedRoute,
    private resultService: ResultService
  ) { }

  ngOnInit() {
    // You can get results from acticated route
    this.activatedRoute.data.subscribe(data => {
      this.results = data.results
    });
  }
}

Здесь - живой пример.

0 голосов
/ 01 августа 2020

Передайте groupId в качестве параметра для функции getResults ().

Public getResults(groupId): Observable<any> {
    
    return this.dataService.getResults(groupId)
    
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...