【问题标题】:Modules in Angular 2(4)Angular 2(4) 中的模块
【发布时间】:2017-06-19 04:17:30
【问题描述】:

我一直在阅读 Angular 2 项目的种子模板,并且有一个关于何时在较大模块中包含模块与组件的问题。我知道建议为每个功能创建模块,但很难决定如何构建。

我有一个项目,其中有一个公共和管理部分(管理员被包裹在一个警卫中)。每个部分都有一些不同的功能,但它们共享相同的底层模型(获取项目、创建项目等)。我的问题是,在知道某些组件需要保护的情况下,构建它的最佳方法是什么?我是否有一个 AppModule,其下方有一个 Public 和 AdminModule(受保护)(具有引用共享模块中的模型的组件)以及每个功能的模块?还是我有一个 AppModule,下面有所有功能模块并直接保护每个组件?我想这个问题被问了很多,或者我问错了地方,所以任何关于在哪里/做什么的方向都将不胜感激。

AppModule 供参考

import { NgModule, Inject } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule, APP_BASE_HREF } from '@angular/common';
import { HttpModule, Http } from '@angular/http';
import { FormsModule } from '@angular/forms';
import { Ng2BootstrapModule } from 'ngx-bootstrap';
import { NavMenuComponent } from './navmenu/navmenu.component';
import { NotFoundComponent } from './not-found/not-found.component';
import { LinkService } from '../shared/link.service';
import { AuthenticationService } from './authentication.service';
import { ORIGIN_URL } from '../shared/constants/baseurl.constants';
import { TransferHttpModule } from '../../modules/transfer-http/transfer-http.module';

@NgModule({
declarations: [
    NavMenuComponent,
    NotFoundComponent
],
imports: [
    CommonModule,
    HttpModule,
    FormsModule,
    RouterModule,
    Ng2BootstrapModule.forRoot(),
    TransferHttpModule,
],
providers: [
    LinkService,
    AuthenticationService,
],
exports: [
    CommonModule,
    HttpModule,
    FormsModule,
    Ng2BootstrapModule,
    TransferHttpModule,
    RouterModule
]
})
export class CoreModule {
}

【问题讨论】:

  • 当您描述一个模块位于另一个模块“下方”时,您能否准确说明您的意思?例如:你写了“我有一个 AppModule,下面有所有功能模块并直接保护每个组件吗?”
  • 就像一个导入所有其他功能模块的 App 模块,我只是将要保护的组件放在顶级路由中。
  • 好的,我想我明白了。写了一个答案。

标签: angular angular2-modules


【解决方案1】:

初步回答

听起来你需要:

  • 一个服务模块——通常命名为CoreModule——具有将被整个应用程序使用的服务(提供者)。例如:自定义AuthenticationServiceHttpService。我还将从此处导出应具有应用范围的 Angular 本机服务(例如:RouterModuleFormsModule)。您的主要AppModule 将是唯一一个导入CoreModule

  • 具有(并导出)应用程序的许多组件共享的组件、指令和管道的小部件模块:SharedModule 可能是一个好名字。

  • 一个非常薄的AppModule,基本上只有一个AppComponent,带有一个路由器插座(如果您的应用程序有路由)和一个裸模板。应用程序的内容将显示在<router-outlet> 中并由接下来的 2 个模块控制

  • CustomerModule 包含专门为最终用户提供应用程序所需的组件、指令和管道(如果您有一个大型应用程序,这可能是几个模块)。该模块将导入SharedModule。您将需要相应的CustomerRoutingModule 和路由器路径到组件说明

  • AdminModule 包含专门用于服务管理界面的组件、指令和管道。您将需要相应的AdminRoutingModule 及其带有路由器指令的Guards

基本上,您需要保护的组件应该只属于 Admin 模块。查看文档中的this link 以获得灵感

附录

标签不存在的错误是因为Ng2BootstrapModule 没有正确导入到引发错误的模块中。将Ng2BootstrapModule(或.forChild(),如果存在)导入SharedModule,并将SharedModule 导入所有其他模块。或者,如果您没有SharedModule,只需将Ng2BootsrapModule(或.forChild(),如果存在)导入您的每个其他模块(CoreModule 除外,它已经有Ng2BootsrapModule.forRoot()

请记住,CoreModule 应该只导入到您的根目录AppModule;不进入其他模块。

【讨论】:

  • 谢谢。我喜欢你提出的想法,但对 CoreModule 中的第 3 方感到好奇。我正在使用 ngx-bootstrap,当我将它移动到 CoreModule 时,我在浏览器中收到有关某些标签不存在的错误。我可以放在那里的东西有限制吗?我已经包含了我当前的 App.Module 以供参考
  • 我会将Ng2BootstrapModule.forRoot() 直接导入到根AppModule,并将Ng2BootstrapModule(或.forChild(),如果存在)导入SharedModule,然后重新导出。如果您没有SharedModule,则直接将Ng2BootstrapModule 导入其他模块。您发布的代码的问题是您尝试导出 Ng2BootstrapModule 但这不是您导入的内容。
  • 其实我上一条评论的最后一句话,请忽略。
  • 那么它应该是什么样子的呢?我很抱歉,但我不太关注。您需要查看更多代码吗?
  • 我在回答中加了一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多