2016-05-31 65 views
3

我有一個用於在組件和其他服務之間共享數據的服務。我正在用angular的DI注入組件和服務。該服務將一些數據存儲在其屬性中(非靜態)。我還使用ComponentResolver來動態創建和加載組件,然後銷燬它們。問題是...如果我用簡單的注入組件中的這樣一種服務:在angular2中注入單例服務

constructor(private myService: MyDataService) { ... } 

此服務器的新實例每次注入和數據丟失。我可以靜態存儲數據,但是有觀察者訂閱這些數據。長話短說 - 太多重構靜態變量的東西。有沒有什麼方法可以讓角色的DI只創建一個這種服務的實例並在每次注入時共享它?

回答

1

這是因爲Angulars DI保持每提供商

單個實例如果你提供的服務只有一次(根組件或bootstrap()),那麼將只有一個實例,內噴射每一個服務或組件它會得到相同的實例。

更新

是的,你必須使用

@NgModule({ 
    providers: [MyService], 
    ..., 
}) 
export class AppModule {} 

@Component({ 
    selector: 'my-app', 
    providers: [MyService], 
    ... 
}) 
export class AppComponent {} 

(或可替代viewProviders

到PR ovide注射劑,但如果你想擁有單身,確保你只提供一次注射

如果您多次提供相同的注射劑,那麼與您提供它的組件相比,它的所有後代將從此提供者獲取實例,而不是從可能提供該實例的祖先那裏獲取實例。

DI是分層結構,從當前組件向根組件和AppModule看一個提供程序。它從它以這種方式找到的第一個提供程序注入實例。

+0

對,你不需要使用boostrap或者至少一個視圖提供者在構造函數中使用DI嗎?這是我的理解,所有注入的服務是單身人士,我不知道它有可能做到新實例.. –

+0

我更新了我的答案,因爲它需要很長時間才能發表評論。 –

+0

謝謝,這工作! – marius