2017-02-11 5 views
0

Я немного огляделся, но, похоже, нет никакого материала для обмена данными между службами в Angular2. У меня есть две службы @Injectable(), где один является Singleton, который передает данные. В другой службе, у меня есть код, который обновляет переменную прогресс как веб-аудио дорожки играет:Обмен данными через службы в угловом 2

import { SharedService } from '../shared.service'; 

... 

@Injectable() 
export class WebAudioTrack implements IAudioTrack { 
    public _progress: number = 0; 
    ... 
    constructor(public src: string, @Optional() public preload: string = 'none', @Optional() private ctx: AudioContext = undefined) { 
    // audio context not needed for now 
    // this.ctx = this.ctx || new AudioContext(); 
    this.createAudio(); 
    } 
    private onTimeUpdate(e: Event) { 
    if (this.isPlaying && this.audio.currentTime > 0) { 
     # I want to do something like SharedService.setProgress(this.audio.currentTime) here 
     this._progress = this.audio.currentTime; 
     this._completed = this.audio.duration > 0 ? Math.trunc (this.audio.currentTime/this.audio.duration * 100)/100 : 0; 
    } 
    } 

Я ищу способ транслировать переменную _progress в коде выше к другому @Injectable называется SharedService , Мне даже не нужно настраивать BehaviorSubject в приведенном выше коде, потому что я должен просто делать что-то вроде SharedService.setProgress (время) при каждом запуске onTimeUpdate.

Вопрос в том, как я могу добавить SharedService в код выше? Когда я пытаюсь добавить его в конструктор, он жалуется, потому что есть призывы к «новому WebTrackAudio (переменная, переменная)». Вот другой код обслуживания, который является неполным и может быть немного запутанным:

@Injectable() 
export class SharedService { 
    progress: number; 

    setProgress(progress: number) { 
     console.log(progress); 
     this.progress = progress; 
    } 
    getProgress() { 
     return this._webTrack._progress; 
    } 

} 

Спасибо!

Когда я обновляю конструктор в первой службы включить SharedService так:

constructor(public src: string, @Optional() public preload: string = 'none', @Optional() private ctx: AudioContext = undefined, public sharedService: SharedService) { 
    // audio context not needed for now 
    // this.ctx = this.ctx || new AudioContext(); 
    this.createAudio(); 
    } 

Я получаю следующее сообщение об ошибке:

машинопись Ошибка

Supplied parameters do not match any signature of call target.

.../src/app/ionic-audio/ionic-audio-providers.ts

create(track: ITrackConstraint) {

let audioTrack = new WebAudioTrack(track.src, track.preload);

Object.assign(audioTrack, track);

+1

Уверен, что вы достигли сути проблемы, которую вы могли бы удалить 2/3 кода. Я нахожу это довольно запутанным, что проблема на самом деле от всего шума. Для обмена данными между службами вы можете просто вводить услугу в другую, если вы не вызываете круговых зависимостей. –

+0

Что вы подразумеваете под «добавлением к конструктору»? Зачем вам нужен вызов 'new WebTrackAudio (переменная, переменная)', если это услуга? –

+0

Я фактически удалил около 90% кода уже (вы можете увидеть ... s). Я предполагаю, что это не сервис? Что тогда? У меня все еще мои ноги мокрые с angular2 – user2476265

ответ

2
import { SharedService } from '../shared.service'; 

... 

@Injectable() 
export class WebAudioTrack implements IAudioTrack { 
    public _progress: number = 0; 
    ... 

    constructor(private sharedService:SharedService) {} 

    private onTimeUpdate(e: Event) { 
    if (this.isPlaying && this.audio.currentTime > 0) { 
     # I want to do something like this.sharedService.setProgress(this.audio.currentTime) here 
     this._progress = this.audio.currentTime; 
     this._completed = this.audio.duration > 0 ? Math.trunc (this.audio.currentTime/this.audio.duration * 100)/100 : 0; 
    } 
    } 

обеспечить предоставление обеих служб как

@NgModule({ 
    ..., 
    providers: [WebAudioTrack, SharedService], 
}) 
export class AppModule {} 
+0

Этот метод приводит меня к следующей ошибке TS: Поставляемые параметры не соответствуют какой-либо сигнатуре целевого вызова. Отредактировано сообщение, чтобы отобразить детали – user2476265

+0

@ user2476265 вы не можете объявить необходимые аргументы после дополнительных. –

+0

Дополнительные параметры, подобные этим, вообще не имеют смысла в сервисах. Было бы необходимо уточнить, как класс фактически используется. –