2017-02-11 37 views
1

我正在使用Angular2和OpenFin構建應用程序。我有一個標記爲Injectable的服務類,並在NgModule中列爲提供者。它被注入到一個組件中,但是隻有當組件被創建時,我的服務類纔會被實例化。我希望在應用程序啓動時創建服務類,而不管我的組件是否已創建,但是在創建組件時,我創建的實例應該注入到組件中。如何使用angular2依賴系統手動註冊提供者的實例

我懷疑我想要做的是在啓動時創建一個服務實例,然後將其傳遞給Angular,告訴它在任何組件需要它時使用該實例。這是可能的還是我必須依靠Angular來實例化我的服務。

感謝 安迪

+0

好像你正在尋找服務的一個單獨的對象。你可以在'rootcompoent'的'ngModule'裝飾器中註冊你的服務。然後該單個實例將可用於整個應用程序。 – micronyks

回答

0

Angular DI是懶惰的,但有一招讓服務實例化渴望:您需要實現OnDestroy接口。

+0

好吧,我現在無法嘗試,現在會報告回來,如果這樣做的話。謝謝。 –

+0

剛剛意識到我可以在我的筆記本電腦上使用的示例應用程序嘗試一下。這個解決方案實際上是有效的,不知道它爲什麼會這樣做,並且有興趣知道爲什麼,但它確實如此非常感謝。 –

+0

這是角度DI的未公開的功能,但官方文檔提到此回調可以與服務一起使用https://angular.io/docs/ts/latest/api/core/index/OnDestroy-class.html – kemsky

2

中註冊中的AppModule的供應商服務元數據將提供給應用程序中的任何組件的服務。

import { YourService } from './your-service.service'; 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    ... 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    ... 
    ], 
    providers: [YourService], // YourService as a provider to the application 
    bootstrap: [AppComponent] 
}) 
export class AppModule { 
    constructor(private yourService: YourService){ 
    this.yourService.Init(); 
    } 
} 

這與在應用程序啓動時註冊容器的單例相同。角會照顧其餘的。

希望這可以幫助你!

+0

感謝您的回答。我遇到的問題是,只有在創建需要它的第一個組件時纔會實例化服務 - 我希望在應用程序啓動時創建該服務,而不管組件是否有任何請求。 –

+0

您的服務是否寫入需要馬上開始的事情?或者,你只是想要創建對象,不管是什麼? –

+0

我的服務正在被另一個進程中運行的另一個服務所使用,這就是爲什麼我不依賴於同一進程中的一個組件,而這個組件也需要它進行請求。理想情況下,我會創建一個服務傳遞的實例,它將Angular和Angular傳遞給需要它的同一個進程中的任何組件。 –

0

要做到這一點只需在@ngModule裝飾的rootcomponent的註冊服務,如下圖所示,

@NgModule({ 
    ... 
    ... 
    providers:[AppService], //scoped to entire application 
    ... 
}) 

每當需要的任何組件現在使用這項服務。

備註:不要在任何單獨的組件中使用/註冊providers:[AppService]。如果您嘗試這樣做,它將僅爲該組件創建一個不同的實例。

相關問題