Angular 2在高级模块中找不到声明

时间:2016-10-25 18:01:36

标签: angular

我有一个嵌套的模块结构,按功能组织:

/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中实现管道。

我的期望是,如果我添加一个“应用程序级别”声明,它将可用于下面的任何模块。

我做错了什么?

1 个答案:

答案 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 {}