2016-08-09 95 views
1

我有兩個組件和兩個組件共享的共享服務。angular2主題不訂閱更改

shared.service.ts

// ..... top level codes are skipped 

private pickAnalysisForBubble = new Subject<any>(); 

    analysisForBubble$ = this.pickAnalysisForBubble.asObservable(); 

    mapToggleToPointOrBubble(value) { 
    this.pickAnalysisForBubble.next(value); 
    } 

utility.component.ts

在視圖(utility.component.html),有兩個單選按鈕,一個是預先選定的:

<input type="radio" name="rdbBubblePoint" class="rdbBubblePoint" value="Point" (change)="changeToPoint($event)"> Point<br> 
<input type="radio" name="rdbBubblePoint" class="rdbBubblePoint" value="Bubble" (change)="changeToPoint($event)" checked="checked"> Bubble<br> 

in component(utility.component.ts),有一種方法來獲取點擊事件:(我已經導入了shared.service,並將此作爲一個供應商。)

changeToPoint(event){ 
    # analysisInteraction is the shared service constructor 
    this.analysisInteraction.mapToggleToPointOrBubble(event.target.value); 
} 

map.component.ts

我已經導入了shared.service並增加了一個構造函數。然後在ngOnInit試圖subscribe的變化,但這是行不通的。

# analysisInteraction is the shared service constructor 
this.analysisInteraction.analysisForBubble$.subscribe(
     data => { 
      this.DrawType = data; 
      console.log("Drawtype fixed"); 
     }); 

我使用subject來檢測在此基礎上tutorial的變化。我做錯了什麼?

回答

1

我想你不共享同一個服務實例。你這樣引導您的應用程序時,指定相應的提供者或主要成分中:

bootstrap(AppComponent, [ SharedService ]); 

@Component({ 
    (...) 
    providers: [ SharedService ] 
}) 
export class AppComponent { 
    (...) 
} 

如果您在子組件providers屬性指定了它,你是不是一定要分享相同的實例...

編輯

因爲hierarc的hical注入器,每個組件都有它自己的實例並且不共享同一個實例。因此,共享服務應作爲供應商添加到main組件中。此外,共享服務不應包含在子組件的提供者中。

+0

是的,我已經在我的組件中添加了'sharedService'作爲提供者。 – Emu

+0

我在我的''main.ts''文件中也在我的子部件中添加了'sharedService'。還是行不通。任何線索? – Emu

+0

這就是問題;-)在這種情況下,每個組件都有自己的實例,不共享同一個實例。這是因爲分級注射器。 –