Получить обновленные данные из служебного метода angular

У меня есть эта услуга.

playerhandler.ts

import { Observable,of,Subject } from 'rxjs';
import { PlayerService } from "./../../core/services/player.service";
import { Injectable } from "@angular/core";
import { DeezerService } from "../services/deezer.service";
import { Track } from "../models/Track";

@Injectable({
  providedIn: "root"
})
export class PlayerHanlder {
  isPlaying: boolean = false;
  index: number;

  constructor(
    private playerService: PlayerService,
    private deezer: DeezerService
  ) { }

  initTracks(tracks): void {
    this.playerService.init(tracks);
  }

  play() {
    this.isPlaying = true;
    this.playerService.play();
  }

  pause() {
    this.playerService.pause();
  }

  stop() {
    this.playerService.stop();
  }

  next() {
    this.playerService.playNext();
  }

  previous() {
    this.playerService.playPrevious();
  }

  playing(playing) {
    this.isPlaying = playing;
  }

  onEnd() {
    this.playerService.playNext();
  }

  start(album) {
    if (this.isPlaying) this.stop();
    this.deezer.getTrackList(album.tracklist)
      .subscribe((tracks: Track[]) => {
        this.initTracks(tracks);
        this.playerService.index = 0;
        this.play();
      });
  }

  startSelectedTrack(tracks,trackIndex) {
    if (this.isPlaying) this.stop();

    this.initTracks(tracks);
    this.playerService.playNew(trackIndex);
    this.isPlaying = true;
  }
}

Метод initTracks(tracks) получает свежие данные каждый раз, когда пользователь щелкает, чтобы воспроизвести альбом, или щелкает, чтобы воспроизвести конкретную дорожку. Это можно увидеть в двух последних методах. Теперь у меня есть queue component, который должен получать данные tracks, которые передаются в метод initTracks(tracks), так что текущий список воспроизведения треков будет показан в queue component. Вот где у меня проблема с реализацией. Я попытался создать наблюдаемое из треков, используя of(tracks) в методе initTracks. Это не сработало. Я также пробовал использовать Subject, чтобы на треки можно было как подписываться, так и подписываться, но это тоже не сработало. Пожалуйста, как мне получить свежие данные, отправленные в метод initTracks(tracks), в компонент очереди? Спасибо.

Если необходимо, это текущий исходный код. исходный код

1
0
82
1

Ответы 1

Пожалуйста, используйте ReplaySubject и сообщите, если помогло. Можете ли вы опубликовать пример кода, в котором вы отправляете данные и подписываетесь?

Не сработало. Реализация, которую я использовал для ReplaySubject, одинакова для наблюдаемых Subject и of. Может я не так делаю. Это реализация. pastebin.com/cxer5zXM

Alf Moh 10.08.2018 18:17

Пожалуйста, сделайте следующее: 1. Убедитесь, что в initTracks console.log (треки) они существуют. 2. измените this.playerHanlder.tracks $ .subscribe (t => console.log (t)) на this.playerHanlder.tracks $ .subscribe (t => console.log (t), er => console.log (er )). Может у вас ошибка.

Vugar Abdullayev 10.08.2018 18:21

Следы действительно существуют. Когда я вхожу в консоль с помощью метода initTracks(tracks), я вижу треки в консоли. Проблема в том, что они не отображаются в queue component, когда я подписываюсь. Кроме того, я просто попытался добавить второй метод в функцию подписки (er => console.log(er)), но ошибок не было. Когда я нажимаю кнопку, в консоли ничего не отображается.

Alf Moh 10.08.2018 18:25

не могли бы вы опубликовать код в stackblitz. Другой проблемы не вижу.

Vugar Abdullayev 10.08.2018 18:29

Это исходный код github.com/alfmoh/waless-spa. Я попытался поместить его в stackbliz, но получил много ошибок, из-за которых не удалось найти файлы стилей.

Alf Moh 10.08.2018 18:34

Другие вопросы по теме