Angular6:使用forRoot() 注册单一实例服务

假如我们有一个shareModule来存放公用的组件(Component)、指令(Directive)、管道(Pipe)、服务(Service),为避免各个子模块引用shareModule时造成App中有多个一样的单一实例服务的问题。我们可以在shareModule中建立同意的App层级的服务。

ShareModule

import { NgModule, ModuleWithProviders } from '@angular/core';

@NgModule({
    imports: [
        HttpModule,
        JsonpModule,
        ...
    ],

    declarations: [
        ShowItDirective,
        ...
    ],
    exports: [
        ShowItDirective,
        ...
    ]
})
export class ShareModule{
    // 给shareModule添加forRoot
    static forRoot(): ModuleWithProviders {
        return {
            ngModule: ShareModule,
            providers: [
                MessageService,
                NotifyService,
                ... any service
            ],

        };
    }
}

AppModule

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    // 使用
    ShareModule.forRoot(),
  ],
  providers: [
    
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

这样ShareModule中每一个service都只在app中注册了一个实例,也避免了每次使用service都要provider的问题。

ERROR NullInjectorError: StaticInjectorError(AppModule)[SurveyComponent -> PermissionCheckerService]: 
NullInjectorError: No provider for PermissionCheckerService!
    原文作者:wuyongqiu
    原文地址: https://segmentfault.com/a/1190000020148472
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞