Как передать данные из компонента в сервис в Angular 2

633
20 июля 2017, 01:17

У меня есть сервис и компонента, в котором есть переменная partNumber - сообщает номер раздела в котором я нахожусь и дает 1, 2 или 3

export class InfoComponent implements OnInit {
 @Output() partEvent = new EventEmitter();
 public partNumber: number;
 ngOnInit() {
 this.partNumber = this.activatedRoute.snapshot.queryParams['part'];
 this.partEvent.emit(this.planetNumber);
   }
}

Мой сервис работает с XML и мне нужно использовать в нем переменную this.partNumber

@Injectable()
export class DataService {
  @Input() planetNumber: string;
  // x2js = new X2JS();
  headers = new Headers({'Content-Type': 'application/json'});
  first = 'assets/first.xml';
  second = 'assets/second.xml';
  third = 'assets/third.xml';
  public x2js = new X2JS();
  constructor(private http: Http) {}
  get(): Observable<any> {
      // TODO: pass a URL as a parameter
      return this.http.get(this.first, this.headers).map((res) => res.text());
  }
}

Я хочу модифицировать код в нечто подобное

      get(): Observable<any> {
        if(this.partNumber === 1){
          return this.http.get(this.first, this.headers).map((res) => res.text());
      } else if(this.partNumber === 2) {
        return this.http.get(this.second, this.headers).map((res) => res.text());
      } else {
        return this.http.get(this.third, this.headers).map((res) => res.text());
      }
}

То есть , если я нахожусь в первой части, то сервис будет обрабатывать первый XML, во второй - второй, а третья часть будет для третьего XML.

Подскажите, пожалуйста, как мне передать значение переменной из компонента в сервис?

Answer 1

В общем по задаче: Вам нужно просто partNumber сделать параметром функции в сервисе. Я бы сделал это так:

public get(part: number): Observable<any> {
  let url;
  switch(part) { 
    case 1:
      url = this.first;
      break; 
    case 2:
      url = this.second;
      break; 
    case 3:
      url = this.third;
      break; 
    default:
      throw new Error("Bad part number");
  }
  return this.http.get(url, this.headers).map((res) => res.text());
}

После протолкните ваш сервис в компонент:

constructor(private dataService: DataService ) { }

И в компоненте получайте данные:

let value = this.dataService.get(this.partNumber);

Так же советую избавится от @Input() planetNumber: string, т.к. имхо сервисы не должны держать в себе состояния.

READ ALSO
Как определить город юзера?

Как определить город юзера?

В последнее время вижу много сайтов, которые при открытии выдают модальное окно с предполагаемым городом и выбором другого, если определенно...

366
Нет подсказок в Форме в Safari

Нет подсказок в Форме в Safari

Заметил такой баг или не баг, что в safari при нажатии "отправить" с пустыми полями не выводит подсказок типа "Заполните это поле", подсказки стандартные,...

305
Получить изменяющийся value=&ldquo;&rdquo; JS

Получить изменяющийся value=“” JS

Как получить изменяющиеся значение value и передать его в другой элемент:

245