2016-07-23 4 views
1

私はこのような角度成分があります。RxJS、:他の方法では、サブスクリプションの結果を受け取ることができません

をそれは通常のReplaySubjectを作成します。 (constructor参照)。 次に、他のコンポーネントの一部は、という方法でsubjectを取得し、それにサブスクライブします。別のコンポーネントは、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

あなたは@ガンターが言ったことを確認しましたか?すべてがエラーなしで動作するはずです。 – micronyks

答えて

0

私は間違いを見たことがありませんが、 あなたはBreadcrumbServiceを複数回お届けしますとします。
Angular2はプロバイダーごとに1つのインスタンスを保持します。複数回提供する場合、複数のインスタンスが存在します。私は、setValueを呼び出すインスタンスは、BreadcrumbComponentとは別のインスタンスでそれを行うと仮定します。

共有インスタンスに共通の親(たとえば、ルート構成子)で提供する場合。

+1

この回答をありがとう!あなたは、絶対に正しい。私は 'BreadcrumbService'を2回提供しました。 –

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); 
    } 
} 
関連する問題