2016-07-23 3 views
1

У меня есть Угловой компонент, как это:RxJS, угловой: Не удается получить результат подписки в других методах

Это создает нормальный ReplaySubject. (см. constructor). Тогда некоторые другие компоненты получают subject по способу getSubject() и подписывают на него. Другой компонент устанавливает новое значение через setValue. Это значение должно быть получено Абонентами. Однако этого не происходит. Он ничего не получает, даже ошибки нет.

@Injectable() 
export class BreadcrumbService { 

    subject: ReplaySubject<string>; 

    constructor() { 
     this.subject = new ReplaySubject<string>(); 
     console.log('Step 1: Subject created'); 
    } 

    getSubject(): ReplaySubject<string> { 
     console.log('Step 2: Return subject for subscribing'); 
     return this.subject; 
    } 

    setValue(title: string) { 
     console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.'); 
     this.subject.next(title); 
    } 
} 

Если я размещаю подписку внутри setValue(), она работает должным образом.

Вот мой компонент, который должен получить подписку:

export class BreadcrumbComponent implements OnInit { 

    constructor(
     private breadcrumbsService: BreadcrumbService 
    ) {} 

    ngOnInit() { 
     this.breadcrumbsService.getSubject() 
      .subscribe(
       success => { 
        console.log(success); // is never called 
       }, 
       error => { 
        console.log(error); // is never called 
       } 
      ); 
    } 
} 

Как мой абонент получит это значение?

+0

Вы проверили, что сказал @Gunter? кроме всего, что должно работать без ошибок. – micronyks

ответ

0

Я не видел ошибку, но Я предполагаю, что вы предоставляете BreadcrumbService не один раз.
Angular2 поддерживает один экземпляр для каждого провайдера. Если вы предоставляете более одного раза, будет несколько экземпляров. Я предполагаю, что экземпляр, который вызывает setValue, делает это в другом экземпляре, чем полученный BreadcrumbComponent.

Если вы хотите, чтобы общий экземпляр предоставлял его у общего родителя (например, корневого компонента).

+1

Спасибо за этот ответ! Вы абсолютно правы. Я предоставил «BreadcrumbService» два раза. –

0

Попробуйте вместо этого использовать Observables.

@Injectable() 
export class BreadcrumbService { 

    subject: Observables<string>; 

    constructor() { 
     this.subject = new Observables<string>(); 
     console.log('Step 1: Subject created'); 
    } 

    getSubject(): Observables<string> { 
     console.log('Step 2: Return subject for subscribing'); 
     return this.subject; 
    } 

    setValue(title: string) { 
     console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.'); 
     this.subject.emit(title); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^