自定义指令在 angular 模块中不起作用?
Custom directive is not working inside angular module?
在我的应用程序中,我有两个模块。 IdentityModule and ServiceModule
。它们被加载为延迟加载技术。
现在我创建了一个与 app.module.ts
绑定的自定义指令 IconSpacerDirective
。它在我的 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 { }
如何在 identityRegistryModule
中使用 IconSpacerDirective
由于您正在导入模块,因此不需要再次显式声明它。从 IdentityRegistryModule
的声明中删除它,因为这是错误明确指出的内容。
在app.module中导出IconSpacerDirective
@NgModule({
...
exports: [IconSpacerDirective] // so that it can be used when this module is imported
})
export class AppModule { }
并在 identityRegistryModule
中导入 app.module
@NgModule({
imports: [
IdentityRegistryRoutingModule,
MaterialModule,
AppModule
]
...
})
export class IdentityRegistryModule { }
如果您想在 AppModule
和 IdentityRegistryModule
中使用 IconSpacerDirective
,那么您需要为该指令创建一个单独的模块,然后您可以在您需要的模块。
@NgModule({
declarations: [IconSpacerDirective],
exports: [IconSpacerDirective]
})
export class IconSpacerModule { }
@NgModule({
imports: [IconSpacerModule]
})
export class AppModule { }
@NgModule({
imports: [IconSpacerModule]
})
export class IdentityRegistryModule { }
如果您只想在 IdentityModule 中使用该指令,则无需在 App.module 中添加它。在身份模块中声明并使用它。但是如果你想在多个模块中使用该指令,包括 app.module 中的组件,那么为通用指令创建单独的模块,如:
通用指令模块
@NgModule({
declarations: [IconSpacerDirective],
exports:[IconSpacerDirective]
})
export class MyCommonModule{}
然后将它导出到任何你想要的地方。假设您想将它用于 app.module 中的组件以及身份模块中的组件,遵循以下逻辑:
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 { }
在我的应用程序中,我有两个模块。 IdentityModule and ServiceModule
。它们被加载为延迟加载技术。
现在我创建了一个与 app.module.ts
绑定的自定义指令 IconSpacerDirective
。它在我的 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 { }
如何在 identityRegistryModule
IconSpacerDirective
由于您正在导入模块,因此不需要再次显式声明它。从 IdentityRegistryModule
的声明中删除它,因为这是错误明确指出的内容。
在app.module中导出IconSpacerDirective
@NgModule({
...
exports: [IconSpacerDirective] // so that it can be used when this module is imported
})
export class AppModule { }
并在 identityRegistryModule
@NgModule({
imports: [
IdentityRegistryRoutingModule,
MaterialModule,
AppModule
]
...
})
export class IdentityRegistryModule { }
如果您想在 AppModule
和 IdentityRegistryModule
中使用 IconSpacerDirective
,那么您需要为该指令创建一个单独的模块,然后您可以在您需要的模块。
@NgModule({
declarations: [IconSpacerDirective],
exports: [IconSpacerDirective]
})
export class IconSpacerModule { }
@NgModule({
imports: [IconSpacerModule]
})
export class AppModule { }
@NgModule({
imports: [IconSpacerModule]
})
export class IdentityRegistryModule { }
如果您只想在 IdentityModule 中使用该指令,则无需在 App.module 中添加它。在身份模块中声明并使用它。但是如果你想在多个模块中使用该指令,包括 app.module 中的组件,那么为通用指令创建单独的模块,如:
通用指令模块
@NgModule({
declarations: [IconSpacerDirective],
exports:[IconSpacerDirective]
})
export class MyCommonModule{}
然后将它导出到任何你想要的地方。假设您想将它用于 app.module 中的组件以及身份模块中的组件,遵循以下逻辑:
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 { }