我有一个嵌套的模块结构,按功能组织:
/app
/lib (not a module)
/pipes
capitalize.pipe.ts
/portal
/dashboard
/public
每个模块都有自己的延迟加载路由。这是我的应用程序,门户和仪表板路线,为简洁省略了导入:
**app.routing.ts**
export const appRouting: ModuleWithProviders = RouterModule.forRoot([
{
path: 'portal',
loadChildren: () => require('es6-promise!./portal/portal.module')('PortalModule')
},
{
path: '',
loadChildren: () => require('es6-promise!./public/public.module')('PublicModule')
}
])
**portal.routing.ts**
export const portalRouting: ModuleWithProviders = RouterModule.forChild([
{
path: 'portal',
component: PortalComponent,
children: [
{
path: 'dashboard',
loadChildren: () => require('es6-promise!./dashboard/dashboard.module')('DashboardModule')
},
],
canActivate: [AuthenticationRequired]
}
]);
**dashboard.routing.ts**
export const dashboardRouting: ModuleWithProviders = RouterModule.forChild([
{
path: '',
component: DashboardComponent
}
]);
我遇到的问题是,如果我向app.module.ts添加声明,例如CapitalizePipe
,则它在延迟加载的模块中不可用。 它只能在应用程序组件级别工作。
我收到:
Template Error: The pipe 'capitalize' could not be found
如果我尝试在dashboard.component.html中实现管道。
我的期望是,如果我添加一个“应用程序级别”声明,它将可用于下面的任何模块。
我做错了什么?
答案 0 :(得分:1)
我遇到的问题是,如果我向app.module.ts添加一个声明,比如CapitalizePipe,它在延迟加载的模块中不可用
对于模块,无论模块是否是延迟加载,都是如此。 @NgModule.declaratations
(即组件,指令和管道)的范围限定在声明它们的模块中(除非该模块导出它们,然后它们可以在导入该模块的其他模块中使用)。
如果您有要共享的声明,建议在共享模块中声明并导出,并将该共享模块导入您想要使用这些项目的任何模块。
@NgModule({
declarations: [ CapitalizePipe, otherStuff ],
exports: [ CapitalizePipe, otherStuff ]
})
class SharedModule {}
@NgModule({
imports: [ SharedModule ]
declarations: [ ComponentThatUsesCapitlizePipe ],
exports: [ ComponentThatUsesCapitlizePipe ]
})
class OtherModule {}