2016-08-12 16 views
2

作成しようとしていますグローバルシングルトン利用可能サービス。私はこの解決策 - https://angular.io/docs/ts/latest/guide/ngmodule.html#!#shared-moduleを読んだが、それは私のために働かない。角2 RC.5シングルトングローバル共有サービス

私は共有モジュール(これは私の短い例である)作成:

NgModule({ 
    imports: [ 
     CommonModule, 
     ReactiveFormsModule 
    ], 
    declarations: [ ShopCartComponent ], 
    exports: [ 
     CommonModule, 
     ReactiveFormsModule, 
     ShopCartComponent, 
    ] 
}) 
export class SharedModule { 
    static forRoot() : ModuleWithProviders { 
     return { 
      ngModule: SharedModule, 
      providers: [ 
       ProductsService, 
       ProductsActions 
      ] 
     }; 
    } 
} 

そして、私のルートアプリケーションモジュールで:

NgModule({ 
    imports: [ 
     BrowserModule, 
     SharedModule.forRoot(), 
     RouterModule.forRoot(routes) 
    ], 
    declarations: [ AppComponent ], 
    providers: [ 
     provideStore({ 
      ... some stores ... 
     }) 
    ], 
    bootstrap: [ AppComponent ] 
}) 
export class AppModule { } 

しかし、私はProductsServiceをを注入しようとしています|

元の例外:ProductsServiceをなしプロバイダ子供モジュールにProductsActionsは、角度のショーは、エラーメッセージが続きます!

それは私の子供のモジュールです:

@NgModule({ 
    imports: [ 
     SharedModule, 
     RouterModule.forChild([ 
      { path: '', component: ProductsComponent } 
     ]) 
    ], 
    declarations: [ ProductsComponent ] 
}) 
export default class ProductsModule { } 

IすでにインポートSharedModule。私はもっ​​と何かをする?

----------------私はすでに私を解決UPDATE -------------------

問題。ルートモジュールのインポートにProductsModuleを追加する必要がありました。

@NgModule({ 
    imports: [ 
     BrowserModule, 
     ProductsModule, 
     RouterModule.forRoot(routes), 
     SharedModule.forRoot() 
    ], 
    declarations: [ AppComponent ], 
    bootstrap: [ AppComponent ] 
}) 
export class AppModule { } 

理由は(私が思う)私はこのように、ルートのルートテーブルにimmadiately別のモジュールをロードしたかったということである:このようなすべての助けを

{ path: '', loadChildren: 'app/components/products/products.module' }, 

みんなありがとう!

+0

同じインスタンスを共有する場合は、ルートコンポーネントにプロバイダ配列を宣言しないでください。それを共有モジュールで保つ方が良い。 – micronyks

+0

可能な重複:http://stackoverflow.com/questions/38913976/how-to-set-global-providers-in-angular2-2-0-0-rc-5 – micronyks

+0

重複していません。コードを見て、私はこのURLからの解決策を使用しましたが、それは私のためには機能しません。 –

答えて

-1

サービスを共有モジュールのproviders属性に設定します。

@NgModule({ 
    imports: [ 
    CommonModule, 
    ReactiveFormsModule 
    ], 
    declarations: [ ShopCartComponent ], 
    exports: [ 
    CommonModule, 
    ReactiveFormsModule, 
    ShopCartComponent, 
    ], 
    providers: [ // <----- 
    ProductsService, 
    ProductsActions 
    ] 
}) 
export class SharedModule { 
    (...) 
} 
+0

しかし、それはすべてのサービスのインスタンスをほとんど作成しませんか? console.logをコンストラクタに追加したところ、すべてのモジュールが独自のサービスを作成したようです。その結果、AppModuleのコンポーネントとProductModuleのコンポーネントが異なるオブジェクトを使用します。 –

+0

これは実際には悪いアドバイスです。https://angular.io/docs/ts/latest/guide/ngmodule.html#!#q-why-it-is-bad –

+0

@ ToanNguyenさんのコメントのリンクが更新されました:https:///angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-why-bad –

関連する問題