2017-02-06 86 views
0

我有一個有趣的問題。我有2個模塊。 app.module.ts(AppModule)和listing.module.ts(ListingsModule)。 ListingsModule有一項服務,我們稱之爲服務A.需要成爲單件全球服務,這意味着所有其他組件和服務都需要能夠與同一個服務器進行交互。Angular2從子模塊導入並聲明全局服務

爲此我首先嚐試聲明A是ListingsModule中的提供者,但是這並沒有像預期的那樣工作,因爲它只是被聲明爲用於組件和服務在ListingsModule下的單例,但我還需要在其他模塊和AppModule下使用它。我因此得出結論:我需要從ListingsModule中導出此服務並導入,並在AppModule下提供此操作,但這並未按預期工作。

A是ListingsStoreService。

//Stores 
import { ListingsStoreService }    from './shared/listings-store.service'; 

//Modules 
import { SharedModule }         from './../shared/shared.module'; 
import { HeaderModule }         from './../header/header.module'; 

@NgModule({ 
    imports: [ 
     SharedModule, 
     HeaderModule, 
     ListingsRoutingModule 
    ], 
    declarations: [ 
     ListingsComponent 
    ], 
    exports: [ 
     ListingsStoreService 
    ], 
    providers: [  ] 
}) 
export class ListingsModule { 
} 

以下代碼要求我聲明或導入ListingsStoreService,因爲它是可導出的。如果我聲明ListingsStoreService,那麼它給了我另一個錯誤。我顯然只能提供這項服務。

這裏的正確方法是什麼?我如何完成這項工作?

+0

添加提供商'forRoot()'https://angular.io/docs/ts/latest/guide/ngmodule.html#!#core-for-root並導入'SharedModule.forRoot( )'在'AppModule的'進口中:[]' –

回答

0

你ListingsStoreService在

imports: [ 
    SharedModule, 
    HeaderModule, 
    ListingsRoutingModule, 
    ListingsStoreService 
], 

需要進口,我認爲這是你的問題。你可以試試這個嗎?我已經寫了一條評論,但是我需要50個聲望...所以這裏是一個答案,我不知道100%是否有效。

+0

抱歉,導入是針對NgModules的。 ListingsStoreService是一項服務。這個答案是行不通的。 –

+0

是的,我明白了。 是否有可能,您只是使用錯誤的目錄進行導入?在第一次導入時,您使用./shared/listings-store.service,然後在第二次導入中使用./../shared/shared.module – Merschi

0

它應該沒有特別的配置。服務在默認情況下具有全局範圍(,只要它們聲明的模塊是熱切加載的)。您的初始配置(您在問題中描述的)應該可以工作。

聲明你的服務於ListingsModule提供者:

@NgModule({ 
    providers: [ ListingsStoreService ] 
}) 
export class ListingsModule { 
} 

AppModule然後導入ListingsModule

@NgModule({ 
    imports: [ ListingsModule ] 
}) 
export class AppModule { 
} 

NB。 ListingsModule必須急切加載,而不是延遲加載。你的問題沒有說明如何加載ListingsModule

0

它的某些模塊(例如RouterModule)的角度是否允許通過慣例通過稱爲「forRoot」和「forChild」的靜態函數創建相同模塊的兩個版本。 「forRoot」可以包含一個全局服務,如提供程序數組中的「ListingsStoreService」,「forChild」會省略它。然後,您可以在AppModule imports數組中調用「ListingsModule.forRoot()」,並在需要「ListingsModule」的地方調用「ListingsModule.forChild()」。

@NgModule({ 
imports: [ 
    SharedModule, 
    HeaderModule, 
    ListingsRoutingModule 
], 
declarations: [ 
    ListingsComponent 
] 
}) 
export class ListingsModule { 
    static forRoot() : ModuleWithProviders { 
     return { 
      ngModule: ListingsModule, 
      providers: [ ListingsStoreService ] 
     };  
    }; 

    static forChild() : ModuleWithProviders { 
     return { 
      ngModule: ListingsModule, 
      providers: [] 
     }; 
    }; 
};