自定义指令在角度模块内不起作用?

时间:2019-12-16 13:52:07

标签: angular typescript angular-directive angular-module

在我的应用程序中,我有两个模块。 IdentityModule and ServiceModule。它们是作为延迟加载技术加载的。

现在,我创建了一个与IconSpacerDirective绑定的自定义指令app.module.ts。我的app.component.ts内部运行良好。

但是它在IdentityModule内部不起作用。我遇到此错误:

ERROR Error: Uncaught (in promise): Error: Type IconSpacerDirective is part of the declarations of 2 modules: AppModule and IdentityRegistryModule! Please consider moving IconSpacerDirective to a higher module that imports AppModule and IdentityRegistryModule. You can also create a new NgModule that exports and includes IconSpacerDirective then import that NgModule in AppModule and IdentityRegistryModule.
Error: Type IconSpacerDirective is part of the declarations of 2 modules: AppModule and IdentityRegistryModule! Please consider moving IconSpacerDirective to a higher module that imports AppModule and IdentityRegistryModule. You can also create a new NgModule that exports and includes IconSpacerDirective then import that NgModule in AppModule and IdentityRegistryModule.

这是我的identityRegistryModule

import { IconSpacerDirective } from '../shared/custom-directive/icon-spacer.directive';
@NgModule({
  declarations: [
    IconSpacerDirective
  ],
  imports: [
    IdentityRegistryRoutingModule,
    MaterialModule   

  ],
  providers: [
    IdentityService,
  ],
})
export class IdentityRegistryModule { }

我的app.module.ts如下:

import { IconSpacerDirective } from './shared/custom-directive/icon-spacer.directive';

@NgModule({
  declarations: [
    AppComponent,
    MainNavComponent,
    SideNavComponent,
    HeaderComponent,
    HomeComponent,
    IconSpacerDirective,

  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    AppRoutingModule,
    FlexLayoutModule,
    BrowserAnimationsModule,
    LayoutModule,
    MaterialModule,
    OAuthModule.forRoot(),
  ],
  providers: [],
  bootstrap: [AppComponent],
  //exports: [IconSpacerDirective]
})
export class AppModule { }

如何在IconSpacerDirective中使用identityRegistryModule

3 个答案:

答案 0 :(得分:2)

如果要在IconSpacerDirectiveAppModule中同时使用IdentityRegistryModule,则需要为该指令创建一个单独的模块,然后可以将其导入其中的模块中。您需要它。

@NgModule({
  declarations: [IconSpacerDirective],
  exports: [IconSpacerDirective]
})
export class IconSpacerModule { }
@NgModule({
  imports: [IconSpacerModule]
})
export class AppModule { }
@NgModule({
  imports: [IconSpacerModule]
})
export class IdentityRegistryModule { }

答案 1 :(得分:1)

由于要导入模块,因此无需再次明确声明它。将其从IdentityRegistryModule的声明中删除,因为这是错误明确指出的内容。

在app.module中,导出IconSpacerDirective

@NgModule({
  ...
  exports: [IconSpacerDirective] // so that it can be used when this module is imported
})
export class AppModule { }

并将app.module导入identityRegistryModule

@NgModule({
  imports: [
    IdentityRegistryRoutingModule,
    MaterialModule,
    AppModule  
  ]
  ...
})
export class IdentityRegistryModule { }

答案 2 :(得分:0)

如果只想在IdentityModule中使用该指令,则无需在App.module中添加它。在“身份”模块中声明它并使用它。但是,如果您想在多个模块(包括app.module中的组件)中使用指令,请为常见指令创建单独的模块,例如:

通用指令模块

@NgModule({
 declarations: [IconSpacerDirective],
 exports:[IconSpacerDirective]
})
export class MyCommonModule{}

然后将其导出到您想要的任何位置。假设您想将其用于app.module中的组件以及Identity模块中的组件,请遵循以下逻辑:

app.module.ts

@NgModule({
imports: [MyCommonModule]
})

identiyt.module.ts

从'../shared/custom-directive/icon-spacer.directive'导入{IconSpacerDirective};

@NgModule({
  imports: [
    IdentityRegistryRoutingModule,
    MaterialModule,
    **MyCommonModule**
  ],
  providers: [
    IdentityService,
  ],
})
export class IdentityRegistryModule { }