【问题标题】:Using Angular component in lazy loaded modules在延迟加载的模块中使用 Angular 组件
【发布时间】:2018-09-07 06:24:21
【问题描述】:

我想在我的应用程序的几个部分中使用 Angular 组件,包括延迟加载模块中的组件。我不知道如何声明组件以在惰性模块中使用它。我将向您展示不同文件的一些相关部分:

app.module.ts

import { FpgTimeComponent } from './fpgTime/fpg-time.component';


@NgModule({
  declarations: [
      AppComponent, 
      (...)
      FpgTimeComponent

app.routing.ts

const appRoutes: Routes = [

    { path: '', redirectTo: 'customer', pathMatch: 'full' },
    {
        path: 'customer',
        component: CustomerComponent
    },
    {
        path: 'lazy',
        loadChildren: 'app/lazy/lazy.module#LazyModule'
    }
];

lazy.module.ts

import { FpgTimeComponent } from '../fpgTime/fpg-time.component';

import { LazyComponent }   from './lazy.component';
import { routing } from './lazy.routing';

@NgModule({
    imports: [routing],
    declarations: [
        LazyComponent, 
        FpgTimeComponent
    ]
})

应用程序加载,但是当我去惰性路由时,它会抛出以下错误:

未捕获(承诺中):错误:类型 FpgTimeComponent 是 2 个模块的声明:AppModule 和 LazyModule!请考虑 将 FpgTimeComponent 移动到导入 AppModule 的更高模块和 懒惰模块。你也可以创建一个新的 NgModule 来导出和 包括 FpgTimeComponent 然后在 AppModule 中导入该 NgModule 和 懒惰模块。

我没有在任何地方导入 LazyModule,因为它是延迟加载的。那么,我如何声明组件 FpgTimeComponent 以便能够在惰性模块中(以及在非惰性组件中)使用它?

提前致谢,

【问题讨论】:

    标签: angular


    【解决方案1】:

    FpgTimeComponent 不是将要加载的惰性模块文件的一部分,所以你不能这样做。想一想,您正试图在惰性模块中导入一个组件,该模块对此一无所知,因为它没有在该模块中定义,也没有在您在LazyModule 中导入的任何其他模块中定义。那么它从哪里获取组件呢?

    FpgTimeComponent 添加到SharedModule 并将SharedModule 导入您的LazyModule,或将FpgTimeComponent 移动到您的LazyModule。一旦你做了其中之一,它应该就可以工作了。

    前者可能是更好的方法,因为我可以保证,随着您不断开发,您将继续遇到与其他组件/惰性模块相同的错误。如果你在多个地方使用组件,那么它们应该像 Angular best practices defines 一样存在于 SharedModule 中,并且应该在所有惰性模块中导入 SharedModule

    这是一个例子。

    共享模块:

    import { FpgTimeComponent } from './some/path';
    
    @NgModule({
        declarations: [
            FpgTimeComponent
        ],
        exports: [
            FpgTimeComponent
        ]
    })
    

    LazyModule:

    import { SharedModule } from '../shared/shared.module';
    
    import { LazyComponent }   from './lazy.component';
    import { routing } from './lazy.routing';
    
    @NgModule({
        imports: [
            routing,
            SharedModule
        ],
        declarations: [
            LazyComponent
        ]
    })
    

    【讨论】:

    • 没问题。您可能希望创建一个 shared 目录,SharedModule 将在其中存在,并且您的 FpgTimeComponent 组件和所有其他共享组件/指令/管道/等都可以在该 shared 目录中,并且您导入/导出它们都在SharedModule 中,然后在您的应用程序中随意使用。查看SharedModule 的官方 Angular 示例:angular.io/guide/sharing-ngmodules
    • 在您有一个TestModule(Lasy 加载模块)的场景中,您可以在其中动态地单独渲染所有组件(一个一个,根据要求)以进行手动测试。这意味着所有您的组件必须驻留在SharedModule 中,因为测试模块和其他延迟加载模块都需要它们。 我的问题:如果所有组件需要通过共享模块加载,那么延迟加载模块有什么用处?
    • 为什么 Angular 文档不能这么清楚? (谢谢你的好例子!)
    • 好的,但是 app.module.ts 呢?我应该在“声明”部分声明 - FpgTimeComponent 吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2017-02-22
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多