我有一个需要公开提供程序的延迟加载模块,因此我使用forRoot
约定并返回以下代码:
@NgModule({
imports: [RouterModule.forChild([
{path: "", component: LazyComponent},
])],
declarations: [LazyComponent],
})
export class LazyModule {
static forRoot() {
return {
ngModule: LazyModule,
providers: [provider]
};
}
}
问题是当我在我的app模块中调用forRoot时,延迟加载不再起作用。 (我在控制台中看不到单独的块)
@NgModule({
declarations: [
AppComponent,
HelloComponent
],
imports: [
BrowserModule,
AppRoutingModule,
LazyModule.forRoot() <======== this stops the lazy load module
],
bootstrap: [AppComponent]
})
export class AppModule {
}
从我学到的东西应该只是让提供者单身,为什么它不起作用?
答案 0 :(得分:1)
我遇到了类似的问题,我不得不延迟加载具有某些配置的模块。因此,我想出了这个临时解决方案。
惰性模块
@NgModule({
imports: [
RouterModule.forChild([
{path: "", component: LazyComponent},
])],
declarations: [LazyComponent],
})
export class LazyModule {
// considering the function only handle providers
static setDynamicProviders(provider?: any) {
if(LazyModule && LazyModule.__annotations__ && LazyModule.__annotations__[0]){
LazyModule.__annotations__[0].providers.push(provider);
}
return LazyModule;
}
}
父模块
const someService = {
provide: 'SOME_TOKEN',
useFactory: (dependecy1) => (//dome something with dependency1)
deps: [SOME_DEPENDENCY_TOKEN]
}
@NgModule({
imports: [
RouterModule.forRoot([
path: 'lazy',
loadChildren: ()=>(import('*your path to lazy module*').then(ref => ref.LazyModule.setDynamicProvider(someService)))
])
]
})
因此,我只是在修改@NgModule
装饰器创建的 注释 。在此阶段,Angular不支持通过静态方法返回ModuleWithProviders
的延迟加载。
答案 1 :(得分:0)
在LazyModule
导入数组中导入AppModule
时,它不再是“懒惰”了。只应在专用RoutingModule
中引用惰性模块。
因此,如果我理解正确,您希望在LazyModules之间共享服务吗?
如果是,请从LazyModule
移除AppModule
并创建一个SharedModule并移动您想要在SharedModule中的providers
数组内共享的服务。使用AppModule
导入forRoot
中的SharedModule,并在LazyModules
SharedModule
而不是forRoot
答案 2 :(得分:0)
在我们定义模块时尝试以下代码是Lazy RouterModule.forChild:
@NgModule({
imports: [RouterModule.forChild([
{path: "", component: LazyComponent},
])],
declarations: [LazyComponent],
})
export class LazyModule { }
但是当我们加载父模块时,请尝试以下代码:
@NgModule({
declarations: [
AppComponent,
HelloComponent
],
imports: [
BrowserModule,
AppRoutingModule,
RouterModule.forRoot([
{
path: '',
loadChildren: './layout/layout.module#LayoutModule',
canActivate: [AuthGuard]
}
]) <======== right way to load lazy module
],
bootstrap: [AppComponent]
})
export class AppModule {
}
注意:FullPath就像'./moduleFolder/lazy.module#LayoutModule'
请告诉我
答案 3 :(得分:0)
截至目前,无法在将延迟加载的模块中执行forRoot
(或此类的任何其他配置静态方法)。这里的问题在于,这种方法返回一个ModuleWithProviders
,而loadChildren需要一个NgModuleFactory
。