2016-05-25 3 views
3

私はサービスを呼び出し、動作のSubjectからデータを受信する単純なルータを持っています...別のルートに移動し、どのようにして被験者のすべてのオブザーバーを破壊し、必要な時にいつでも新しい被験者を創り出すことができますか?ここでplunkerデモがコンポーネントが初期化されるたびに、Behavior Subjectからデータの複数のインスタンスを受信

ngOnDestroy(){ 
this.srvc.DestroySubject(); 
} 

が...私はngOnDestroyに対象のオブザーバーを破壊する予定ですhttp://plnkr.co/edit/OKiljCekSKHO1zJF5MAy?p=preview
で誰かがどのようにbehaviorsubjectのオブザーバーを破壊する方法を教えていただけますか?

+0

のようなサービスにthis.srvc.GetData();への呼び出しを移動することができ、それを修正するにはあなたが欲しいもの。あなたが解決しようとしている実際の問題についてより多くの情報を提供すれば、私はより良い解決策を提供できるかもしれません。 –

答えて

3

動作は期待されています。あなたはsrvc.Dataに加入してDataBehaviorSubjectあるので、それは最も最近の放出された値を返すコンストラクタで

export class Sample1 { 
    constructor(public srvc:HeroService) { 
     this.srvc.Data.subscribe(data=> { 
     console.log(data); 
     }); 
     this.srvc.GetData(); 
    } 
} 

Datanullと初期化すると、最初はデータがありません。

コンストラクタでは、this.srvc.GetData()と呼び出すと、イベントが発行され、サブスクリプション(前の行)で受信されます。

移動して戻ると、Sample1が再び初期化され、コンストラクターが実行されます。まず、srvc.Dataを購読しています。前回の呼び出しでGetData()(最初にHeroesにナビゲートしたとき)からReceived Dataという最後に出力された値を取得します。

次はthis.srvc.GetData()への呼び出しで、もう一度Received Dataが発行され、サブスクリプションでこの値が渡されます。

回避策

は、あなたの代わりに私の答えで提案された回避策がある場合、私は知らない

@Injectable() 
export class HeroService { 
    Data: BehaviorSubject<RepairOrder> = new BehaviorSubject(null); 

    constructor() { 
    this.GetData(); 
    } 

    GetData(){ 
    this.Data.next('Recieved Data'); 
    } 
    DestroySubject(){ 
    //alert('hi'); 
    } 
} 

Plunker example

+0

ありがとうございました...これは良い答えです...しかし、私はより多くの情報を与えるために私のプランナーデモhttp://plnkr.co/edit/OKiljCekSKHO1zJF5MAy?p=previewを更新しました...私は秒でボタンを持っています私がそのボタンをクリックすると、私は被験者がデータを発信し、他のコンポーネントにナビゲートするサービスを呼び出しています...どうすればこのようにすることができますか。この場合の回避策を変更する必要がありますか? –

+1

トリッキー。この場合、「Sample1」の2つのインスタンスが存在するように見えます。 'ngOnDestroy()'の購読を解除するとhttp://plnkr.co/edit/o2Onm3G43m1siDo7bA4H?p=preview –

+0

ありがとう@ガンター –

関連する問題