承诺被拒绝:没有服务提供商

时间:2017-03-09 10:51:04

标签: angular

我已开发此ApiModule以提供UsersServicePlansService等服务:

@NgModule({
  imports:      [ CommonModule, HttpModule ],
  declarations: [],
  exports:      [],
  providers:    [ PlansService, UsersService ]
})
export class ApiModule {

我还创建了一个CoreModule,如:

@NgModule({
  imports: [
    ApiModule
  ]
})
export class CoreModule { }

我在AppModule使用

@NgModule({
  bootstrap: [ App ],
  declarations: [
    App,
    ErrorComponent
  ],
  imports: [ // import Angular's modules
    BrowserModule,
    CoreModule,
    FormsModule,
    HttpModule,
    RouterModule.forRoot(ROUTES, { useHash: true })
  ]
})
export class AppModule {

我使用RouterModule使用延迟加载策略加载组件。路线容限如下:

export const ROUTES: Routes = [{
   path: '', redirectTo: 'login', pathMatch: 'full'
}, {
    path: 'login', loadChildren: () => System.import('./login/login.module')
  }, { ...

所以,LoginModule

export const routes = [
  { path: '', component: LoginComponent, pathMatch: 'full' }
];

@NgModule({
  declarations: [
    LoginComponent
  ],
  imports: [
    RouterModule.forChild(routes),
  ]
})
export default class LoginModule {

然而,我收到消息错误:

  

未处理的承诺拒绝:没有UserService的提供商!

LoginComponent正在尝试解决构造函数注入问题:

export class LoginComponent implements OnInit {
    constructor(private commty: UsersService)
    ...
}

但是,ApiModule提供了UsersServiceApiModule导入了CoreModuleAppModule导入了LoginModule

为什么UsersService无法获得CoreModule个实例?

我还尝试将LoginModule导入jar { archiveName = 'Name.jar' manifest { attributes 'Main-Class': 'your main', 'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '), 'Implementation-Version': project.version } from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) } ,但它仍然失败。

1 个答案:

答案 0 :(得分:1)

如果您希望ApiModule包括CoreModule,则需要从CoreModule

导出
@NgModule({
  imports: [
    ApiModule
  ],
 exports: [
   ApiModule
 ]
})
export class CoreModule { }

这真的使它成为shared module。 您也可能必须在CoreModule中导入LoginModule。但这与您的延迟加载策略相反。您需要浏览链接中的为什么不共享UserService 部分。 它指定:

  

不要在共享模块中指定应用程序范围的单例提供程序。一个   导入该共享模块的延迟加载模块会创建自己的副本   服务。