2016-05-25 33 views
3

我有一個簡單的路由器,我打電話給一個服務並從行爲主體接收數據Subject ...當我導航到另一個路由並且我收到多個從主題的價值...我如何銷燬一個主題的所有觀察者,並創建一個新的主題,只要我需要...?這裏是plunker演示http://plnkr.co/edit/OKiljCekSKHO1zJF5MAy?p=preview
我打算摧毀ngOnDestroy對象的觀察員......每次組件被初始化時接收來自Behavior的數據的多個實例

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

有人可以告訴我如何摧毀一個behaviorsubject的觀察員?

+0

我不知道如果我的回答所提出的解決方法是你想要什麼。如果您提供更多關於您嘗試解決的實際問題的信息,我可能會提供更好的解決方案。 –

回答

3

該行爲是預期的。

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

在您訂閱srvc.Data構造函數和,因爲DataBehaviorSubject它返回最近發出的價值。您初始化Datanull,因此起初沒有數據。

然後在構造函數中調用this.srvc.GetData()這會導致事件被髮送並被訂閱接收(之前的行)。

如果您離開並返回,則Sample1會再次初始化,並執行構造函數。第一件事是訂閱srvc.Data。並且它獲得最後發射的值,即從先前呼叫的Received DataGetData()(當我們第一次導航到英雄時)。

接下來是呼叫this.srvc.GetData(),它再次發出Received Data並且訂閱獲得該值。

解決方法

要解決它,你可以在呼叫轉移到this.srvc.GetData();的服務,而不是像

@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

謝謝...這是一個很好的答案...但我已經更新了我的plunker演示http://plnkr.co/edit/OKiljCekSKHO1zJF5MAy?p=preview給更多的信息.​​..我在第二個按鈕路線,當我點擊那個按鈕,我打電話給主題發射數據的服務,我將導航到其他組件......我怎麼能在這種情況下先生。我應該改變這種情況下的解決方法嗎? –

+1

棘手。在這種情況下,似乎存在'Sample1'的兩個實例。退訂'ngOnDestroy()'修復了它http://plnkr.co/edit/o2Onm3G43m1siDo7bA4H?p=preview –

+0

謝謝@Gunter –

相關問題