2016-09-13 17 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方法では、どちらのバージョンでangular2を使用していますか? – micronyks

答えて

3

各コンポーネントのプロバイダにサービスを追加しないでください。このようにして、各コンポーネントは独自のインスタンスを取得し、サービス間の通信には使用できません。

サービスはAppModuleまたは共有親コンポーネントで1回のみ提供してください。

+0

これをやり、インポートだけを残しましたが、助けにはなりませんでした。 –

+0

私はセットアップと問題が非常に似ていました。モジュールのプロバイダにリストされていた「コントローラ」を通してメニューを切り替えることを試みていました。期待どおりログアウトされたものの、サブスクライブコールバックは決して呼び出されませんでした。ここから取り出して(そして注入可能なデコレータを取り除いて)私のためにそれを固定しました。面白いことにAuguryで検査したところ、私のメニューコンポーネントが依存していた "コントローラ"のインスタンスは、決して値を変更しなかったことが明らかになりました。まだ質問が残っていますが、コントローラをプロバイダとしてリストすると、新しいインスタンスが作成されるのはどうですか? – mcabe

+0

プロバイダを登録することはすべてインスタンスを作成することです。 Angular DIはプロバイダごとにインスタンスを作成します。複数のインスタンスが作成されるコンポーネントに複数のプロバイダまたは1つのプロバイダがある場合、サービス(コントローラ)のインスタンスをいくつでも取得できます。あなたが提供する場所は、どのインスタンスがどこに注入されるかを決定します。モジュールで登録されたプロバイダにまだ見つかっていない場合は、コンポーネント、プロバイダ、およびその親の依存関係を要求するコンポーネント(ディレクティブ、パイプ、サービス)からAngular 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'で置き換えると問題が解決します。 – micronyks