为什么共享模块导入失败?

时间:2019-09-23 09:00:22

标签: javascript angular typescript import module

我有一个小角度的应用程序,它使用CoreModuleSharedModule模式。因为 目前,我的应用程序很小,我已经将SharedModule导入了根模块AppModule中。我也有一个名为AdminModule的延迟加载的管理模块,但即使已将其导入到根模块中,它似乎也无法访问共享模块。我必须再次显式导入SharedModule才能在管理模块的组件中使用它。为什么是这样?如果必须在每个延迟加载的模块中再次重新导入它们,那么将它们导入到根模块中又有什么意义呢?

AppModule

...
imports: [
    BrowserModule,
    BrowserAnimationsModule,
    MatExpansionModule,
    AppRoutingModule,
    AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule, // imports firebase/firestore, only needed for database features
    AngularFireAuthModule, // imports firebase/auth, only needed for auth features,
    AngularFireStorageModule, // imports firebase/storage only needed for storage features
    SharedModule, // To be imported on each feature module, instead of AppModule. For now, this is fine though
    CoreModule,
    HttpClientModule
  ],
...

应用程序路由模块(延迟加载)

const routes: Routes = [
  {
    path: 'admin',
    loadChildren: './admin/admin.module#AdminModule',
    canActivate: [AdminAuthGuard]
  }]

AdminModule

...
imports: [CommonModule, AdminRoutingModule, SharedModule, CoreModule],

一个例子是,如果我在SharedModule中有一个页脚组件,并尝试在AdminHomeComponent的一部分AdminModule中使用它,则会收到错误消息(不导入SharedModule)。导入时一切正常。

2 个答案:

答案 0 :(得分:2)

导入模块使导入外部模块的模块组件能够查看该导入模块中的组件。但是只有该模块中的模块,而不是嵌套模块中的模块。

在根模块中导入模块对PROVIDERS很有用,这与Components完全不同。

如果导入在模块中提供服务的模块,则该模块和嵌套模块中的所有组件都将能够看到提供程序。 (这就是为什么最好的做法是,如果模块的提供者和组件将被重用,则仅将模块的提供者置于静态的forRoot()方法中。)

答案 1 :(得分:0)

我还在另一篇https://stackoverflow.com/a/43153529/8948458

上找到了一个很好的答案
  

创建新模块(无论是否懒惰),任何新模块并在其中声明任何内容的那一刻,该新模块便处于干净状态。它什么都不知道,