【问题标题】:Can't load shared directives of a NgModule in other NgModules无法在其他 NgModule 中加载 NgModule 的共享指令
【发布时间】:2016-09-01 18:29:15
【问题描述】:

discussion 之后,我遇到了同样的问题:我无法在多个模块中导入 angular2-materialize 的指令,而不会出现错误消息“类型 X 是 2 个模块的声明的一部分”

我决定遵循给定的解决方案:将 angular2-materialize 放在它自己的模块中,然后将该模块导入我的 AppModule 和 ChildrenModule。

所以我的 MaterializeModule

import { NgModule } from '@angular/core';

// Import Materialize CSS + Directives, like indicated in the readme 
// https://github.com/InfomediaLtd/angular2-materialize
import 'materialize-css';
import 'angular2-materialize';

import { MaterializeDirective } from 'angular2-materialize';

@NgModule({
    declarations: [ MaterializeDirective ]
})
export class MaterializeModule {
}

我的AppModule

import { MaterializeModule } from './shared/materialize.module';

@NgModule({
  bootstrap: [ AppComponent ],
  declarations: [
    AppComponent,
    HeaderComponent,
    FooterComponent,
    NoContentComponent
  ],
  imports: [ // import Angular's modules
    BrowserModule,
    FormsModule,
    HttpModule,
    MaterializeModule,
    RouterModule.forRoot(ROUTES, { useHash: false })
  ],
  providers: [ // expose our Services and Providers into Angular's dependency injection
    ENV_PROVIDERS,
    APP_PROVIDERS
  ]
})
export class AppModule {}

还有我的ChildrenModule

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// Import shared modules
import { MaterializeModule } from '../shared/materialize.module';

// Import child routes
import { detailsRouting } from './details.routing';

// Import app modules
import { DetailsComponent} from './details.component';

@NgModule({
    imports: [
        BrowserModule,
        MaterializeModule,
        detailsRouting
    ],
    declarations: [
        DetailsComponent
    ]
})
export class ChildrenModule { } //

最后,在这两个模块中,我简单地放置了一个带有 MD 模态的模板:

<a materialize="leanModal" [materializeParams]="[{dismissible: false}]" class="waves-effect waves-light btn modal-trigger blue" href="#missionAccept">
                <i class="material-icons left">check</i>Accepter
            </a>

我认为它肯定会解决我的问题,但没有。

我有:

can't bind to 'materializeParams' since it isn't a known property of 'a'

喜欢它从未导入 MaterializeDirective。

我从几个小时就开始关注这个问题,它可能来自哪里?

编辑

这解决了我的问题:

在我的 MaterializeModule 中,永远不要忘记导出指令:

@NgModule({
    ...
    exports: [ MaterializeDirective ]
})

【问题讨论】:

    标签: angular module angular2-directives


    【解决方案1】:

    这里的关键是按照 angular.io 上的说明使用共享模块。您创建模块并导入您想要与其他模块共享的任何内容。要使用它们,请将 sharedmodule 导入需要指令或管道的模块中。

    这是我的共享模块:

    import { NgModule, ModuleWithProviders } from '@angular/core';
    import { HttpModule } from '@angular/http';
    import { RouterModule } from '@angular/router';
    import { CommonModule } from '@angular/common';
    import { ReactiveFormsModule } from '@angular/forms';
    import { AuthorizationService } from '../services/authorization.service';
    import { LoginService } from '../services/login.service';
    import { RegisterService } from '../services/register.service';
    import { ValidationService } from '../services/validation.service';
    import { AppMenuService } from '../services/appMenu.service';
    import { AuthGuardService } from '../services/authGuard.service';
    import {InputTextModule, GalleriaModule, MenubarModule } from 'primeng/primeng'
    
    @NgModule({
       imports: [ CommonModule, RouterModule, HttpModule, MenubarModule, 
                  GalleriaModule, InputTextModule ],
       declarations: [ ], 
       exports:  [ CommonModule, ReactiveFormsModule, HttpModule, RouterModule, 
                   MenubarModule, GalleriaModule, InputTextModule ] 
    })
    
    export class SharedModule {
      static forRoot(): ModuleWithProviders {
      return {
         ngModule: SharedModule,
         providers: [ AppMenuService, AuthorizationService, LoginService, 
                      RegisterService, ValidationService, AuthGuardService ]
          };
       }
    }
    

    由于它是可共享的,因此我在整个应用程序中都使用它。

    【讨论】:

    • 嗨,这正是我对 MaterializeModule 所做的:在里面公开 MaterializeDirective,让它们在我导入该模块的其他模块中可用。我注意到的一个区别是您在 NgModule 中使用了 export[] 属性。这是我第一次看到这个楼盘。是否必须使用属性才能使其正常工作?
    • 就是这样,我必须将共享模块添加到包含它的模块的 export[] 属性中。谢谢很多:)
    • @DlafCreative:您是否愿意用已完成的修复来更新您的示例?我也在努力使用 Angular2-materialize 指令。
    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2017-02-15
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多