typescript 组件由多个NgModule声明

byqmnocz  于 2023-03-19  发布在  TypeScript
关注(0)|答案(3)|浏览(233)

所以我创建了一个组件ExampleComponent,并在一个模块中声明了它,而该模块没有在app.module中列出。接下来,我想在一个模块中声明组件ExampleComponent,而该模块在app.module中列出。我该怎么做呢?如果我只是简单地声明它,那么我会得到以下错误:组件ExampleComponent**由多个NgModule声明。
abc.module.ts

import { ExampleComponent} from '../Example/Example.component';
@NgModule({
  declarations: [
    ExampleComponent
  ]
})

app.module.ts

import { NewModule} from '../new/new.component';
@NgModule({
  imports: [
    NewModule
  declarations: [
    
  ]
})

new.module

import { ExampleComponent} from '../Example/Example.component';
    @NgModule({
      declarations: [
        ExampleComponent
      ]
    })
jqjz2hbq

jqjz2hbq1#

如果您在多个模块中使用您的组件,则意味着该组件是共享的,您需要为您的ExampleComponent创建一个独占模块(ExampleModule),然后将该模块导入到您希望使用ExampleComponent的任何位置。
因此,创建示例模块:

import { NgModule } from '@angular/core';
import { ExampleComponent} from '../Example/Example.component';
@NgModule({
  declarations: [
    ExampleComponent,
  ],
  exports: [
    ExampleComponent,
  ]
})
export class ExampleModule { }

然后将其导入到您想要使用ExampleComponent的位置(导入到abc moduleapp module中),如下所示:

import { ExampleModule } from '../example.module';
@NgModule({
  imports: [
    ExampleModule 
  ]
  ...
})

通过为您的共享组件定义单独的模块,您提供了一些封装层,您可以在其中描述和提供组件工作所需的所有依赖项,因此,在将来,所有使用者只需要导入模块本身,而不需要知道关于所有这些依赖项的任何信息。

svdrlsy4

svdrlsy42#

如果组件是在app.module.ts文件而不是模块文件中导入的,则会发生此错误。

案例研究:
我的文件夹结构如下:

app 
   src 
     component 
        general.component.ts 
        general.component.html 
        general.component.scss 
        general.component.spect 
        general.module.ts
        general.model.ts 
        general.services.ts
app.module.ts
app.routing.ts

错误***“组件由多个NgModule声明”***将在以下情况下发生
在app.module.ts文件中,如果您已按如下方式导入;

一月一日

@NgModule({
          declarations: [
           GeneralComponent
          ],
    })

为解决此问题而进行的更改

1.导出general. modul.ts中的general.component,如下图所示:

常规模块ts

import { NgModule } from '@angular/core'
    import { CommonModule } from '@angular/common'
    import { GeneralComponent } from './general.component'    
    @NgModule({
      declarations: [GeneralModule.rootComponent],
      imports: [CommonModule],
      exports: [GeneralModule.rootComponent],
      entryComponents: [GeneralModule.rootComponent],
    })
    export class GeneralModule {
      static rootComponent = GeneralComponent
    }

1.在应用程序模块中导入通用模块

应用程序模块.ts

import { GeneralModule } from './component/graph-general/graph-general.module';
    @NgModule({
      declarations: [
      ],
      imports: [  
         GeneralModule ,
    ]
    }) 
    export class AppModule { 
}

注意:声明中只应包含组件,所有模块应包含在导入中。

7vux5j2d

7vux5j2d3#

app.module.ts文件中,您应该只导入 Package ComponentModule,因为它是您的最高导入级别。
在我的例子中,我给你举了下面的例子:
layout.module.ts

@NgModule({
  declarations: [
    ToolbarComponent // HERE.
  ],
  imports: [
    CommonModule, 
    SharedModule,
  ],
  exports: [
    ToolbarComponent // HERE.
  ]
})
export class LayoutModule { }

app.module.ts

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    LayoutModule, // HERE.
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

有了这个设置,我可以完全访问我的app.component.html中的ComponentSelector<app-toolbar></app-toolbar>,只是导入LayoutModule

相关问题