代码之家  ›  专栏  ›  技术社区  ›  techguy2000

如何使用带提供程序的模块导入角度模块中的其他模块

  •  1
  • techguy2000  · 技术社区  · 6 年前

    我在一个模块内有一个服务。我称之为“服务”和“amodule:

      @Injectable()
      export class AService {
        constructor() { }
      }
    
      @NgModule({
        imports: [CommonModule],
        providers: [AService]
      })
      export class AModule {}
    

    我在B模块内有一个B服务。B服务取决于服务:

      @Injectable()
      export class BService {
        constructor(
          private aService: AService
        ) { }
      }
    

    对于B模块,我使用的是modulewithproviders:

      @NgModule({
        imports: [CommonModule, AModule]
      })
      export class BModule {
        public static forRoot(settings: any): ModuleWithProviders {
          return {
            ngModule: BModule,
            providers: [
              BService
            ]
          };
        }
      }
    

    即使我正在导入amodule,我也没有为服务提供程序。对于moduleWithProviders,导入似乎被忽略:

      Promise rejection: StaticInjectorError(AppModule)[BService -> AService]:
      ...
      No provider for AService!
    

    模块依赖于amodule的正确方法是什么?

    1 回复  |  直到 6 年前
        1
  •  3
  •   faizan baig    6 年前

    我想你是用另一种方式做的。 对于共享模块,您必须使用modulewithproviders,在共享指令和服务的模块中,然后使用forroot指令将该模块导入到应用程序模块中。

    您可以使用以下示例。

    共享模块

    import { NgModule, ModuleWithProviders } from '@angular/core';
    @NgModule({
      declarations: [
        Pipes, Directives
      ],
      exports: [
        Pipes, Directives
      ]
    })
    export class SharedModule {
      static forRoot(): ModuleWithProviders {
        return {
          ngModule: SharedModule,
          providers: [ SomeService ]
        };
      }
    } 
    

    现在在应用程序模块中导入共享模块。 应用程序模块

    import { SharedModule } from './shared/shared.module';
    @NgModule({
      declarations: [
        AppComponent
      ],
      imports: [
        BrowserModule,
        SharedModule.forRoot()
      ],
      bootstrap: [
        AppComponent
      ]
    })
    export class AppModule {}
    

    您也可以在任何模块中导入该共享模块,而不使用forroot()。

    其他模块

    import { SharedModule } from '../shared/shared.module';
    
    // ...
    
    @NgModule({
      imports: [
        CommonModule,
        SharedModule
      ],
      declarations: [
        // ...
      ]
    })
    export class SomeFeatureModule {}