我已开发此ApiModule
以提供UsersService
和PlansService
等服务:
@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
提供了UsersService
,ApiModule
导入了CoreModule
,AppModule
导入了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) })
}
,但它仍然失败。
答案 0 :(得分:1)
如果您希望ApiModule
包括CoreModule
,则需要从CoreModule
@NgModule({
imports: [
ApiModule
],
exports: [
ApiModule
]
})
export class CoreModule { }
这真的使它成为shared module。
您也可能必须在CoreModule
中导入LoginModule
。但这与您的延迟加载策略相反。您需要浏览链接中的为什么不共享UserService 部分。
它指定:
不要在共享模块中指定应用程序范围的单例提供程序。一个 导入该共享模块的延迟加载模块会创建自己的副本 服务。