2016-09-13 4 views
1

У меня есть некоторые проблемы с BehaviorSubject. Вот общий сервис для трех компонентов:Угловая 2 не подписаться с общим сервисом

import { Injectable } from '@angular/core'; 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 

@Injectable() 
export class StageEndService { 

    private stageNumber = new BehaviorSubject<number>(0); 
    private stageNumberPassed = new BehaviorSubject<number>(0); 

    stageNumber$ = this.stageNumber.asObservable(); 
    stageNumberPassed$ = this.stageNumber.asObservable(); 

    announceStageNumber(num) { 
    this.stageNumber.last(num); 
    } 

    announceStageNumberPassed(num) { 
    this.stageNumberPassed.last(num); 

    } 
} 

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

import { StageEndService } from './../../../common/services/stage-end.service'; 

@Component({ 
... 
providers: [StageEndService] 
}) 

... 
private value = 6; 

constructor (private stageEndService: StageEndService) { 

    this.stageEndService.announceStageNumber(value); 

} 

Второй компонент похож, но изменяется значение stageNumberPassed.

В моем последнем компоненте я пытаюсь подписаться, но не в состоянии (console.log возвращает 0):

import { StageEndService } from './../../../common/services/stage-end.service'; 

// there's no provider here since it's not necessary if I'm correct 

constructor(private stageEndService: StageEndService) {} 

ngOnInit() { 
    this.stageNumberSubscription = this.recruitmentEndService.stageNumber$.subscribe(response => { 
    this.stageNumber = response; 
}); 

Понятия не имею, где проблема. Когда я регистрирую значения, переданные функции в службу, он возвращает правильные числа. Не знаю, имеет ли это значение, но на всякий случай: последний компонент (где я пытаюсь подписаться) - правнуки первого компонента, когда я устанавливаю новое значение в первый раз.

+0

Что такое 'последний (...)' должен делать? Для меня это означает, что вы использовали 'next()' –

+0

. Я не знаю метода .last(), поэтому просто говорю, чтобы заменить его на .next() или .emit(). – micronyks

+0

С помощью d way, в какой версии вы используете angular2? – micronyks

ответ

3

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

Предоставлять услугу только один раз в AppModule или общий родительский компонент.

+0

Выполнено, и оставить только импорт, но это не помогло. –

+0

У меня были очень похожие настройки и проблемы. Была попытка переключить меню через «контроллер», который я указал в провайдерах модуля. Все вышло из строя, как ожидалось, но callback-вызов подписки никогда не вызывался. Убрав его отсюда (и удалив инъецируемый декоратор), он исправил его для меня. Интересно, что проверка в Augury показала, что экземпляр «контроллера», что мой компонент меню зависел, никогда не менял значений. Все еще остались вопросы, как листинг контроллера как поставщика создает новые экземпляры? – mcabe

+0

Регистрация поставщика - это создание экземпляров. Угловой DI создает экземпляр для поставщика. Если у вас есть несколько поставщиков или один поставщик на компоненте, где создаются несколько экземпляров, вы получаете столько экземпляров службы (контроллера). Там, где вы его указываете, также определяется, какой экземпляр вводится где. Угловой DI выполняет поиск из компонента (директива, канал, служба), который запрашивает зависимость для поставщиков в компоненте, потом его родителей, и если ни один из них не был обнаружен у поставщиков, зарегистрированных в модулях. –

1
this.recruitmentEndService.stageNumber$.subscribe(response => { 
    this.stageNumber = response; 
}); 

должен быть

this.stageEndService.stageNumber$.subscribe(response => { 
    this.stageNumber = response; 
}); 
+0

Спасибо за помощь, но проблема должна быть где-то в другом месте, поскольку ни один из них не исправил ее. –

+0

Пункт 4 кажется проблемным в вашем случае. – micronyks

+0

заменить 'recruitmentEndService' на' stageEndService' shold решить проблему. – micronyks

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