Angular2  NgModule 模块详解


Posted in Javascript onOctober 19, 2016

Angular的模块的目的是用来组织app的逻辑结构。

在ng中使用@NgModule修饰的class就被认为是一个ng module。NgModule可以管理模块内部的Components、Directives、Pipes,引入Service,并控制外部组件对内部成员的访问权限。

angular2 具有了模块的概念,响应了后台程序的号召,高内聚 低耦合。模块就是用来进行封装,进行高内聚  低耦合的功能。

其实各人认为ng2 的模块和.net的工程类似,如果要使用模块中定义的功能,第一步就是必须要引用它,ng2 中叫import 导入。

那么我们看模块是否有层级概念呢,至少目前来看,模块都是平级的,没有主子之分。

如何定义模块呢?

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

/* App Root */
import { AppComponent } from './app.component';

/* Feature Modules */
import { ContactModule } from './contact/contact.module';
import { CoreModule } from './core/core.module';
import { routing } from './app.routing';
import { Title } from '@angular/platform-browser';
@NgModule({
 imports: [
  BrowserModule,
  ContactModule,
  /*
    CoreModule,
  */
  CoreModule.forRoot({ userName: 'Miss Marple' }),
  routing
 ],
 declarations: [AppComponent],//声明当前模块需要的指定 组件信息
 exports:[],
 providers: [Title],
 bootstrap: [AppComponent]
})
export class AppModule { }

 简单说明一下模块元数据中各个参数的用途。

imports:导入其他模块,就是要使用其他模块的功能,必须要导入。

declarations:声明,声明本模块包含的内容。可能有些同学会遇到,定义了一个指令,在component中使用却总是没有生效的问题,首先我们要检查的就是是否进行了声明。

exports:外部可见的内容。相当于.net中声明为public的那些类。

providers:服务提供者,主要用来定义服务。估计ng2框架会自动将注册的服务体检到依赖注入实例中,目前测试也是如此。

bootstrap:启动模块。只在根模块使用。在除了根模块以外的其他模块不能使用。

2.问题2

目前官方叫法:启动模块为根模块,自定义的其他模块叫特性模块。

我们是否可以在特性模块中import根模块呢?

实验是检验真理的最好方法。

import { NgModule }      from '@angular/core';
import { SharedModule }    from '../shared/shared.module';

import { ContactComponent }  from './contact.component';
import { ContactService }   from './contact.service';
import { routing }      from './contact.routing';
import{GuozhiqiModule}from '../directives/guozhiqi.module';
import{AppModule}from '../app.module';
@NgModule({
 imports:   [ SharedModule, routing,GuozhiqiModule,AppModule ],// 导入模块
 declarations: [ ContactComponent ],//声明 指令 
 providers:  [ ContactService ]//服务提供者 在当前模块提供者中注册当前模块需要的服务
})
export class ContactModule { }

appModule是根模块,我们定义的contactModule是特性模块,现在我们通过imports 导入根模块。

Angular2  NgModule 模块详解

 执行出现错误,contactModule导入了一个undefined的module?

为什么会出现这个问题呢?

各人估计是因为1.导致了循环引用的问题。appModule会加载ContactModule,而在ContactModule中又要import 根模块,导致循环引用,从而出现错误。

2.另一种解释就是根模块不允许导入。ng2框架不允许这样

问题3:如何避免出现循环引用呢?

官方给出了答案:https://angular.cn/docs/ts/latest/guide/ngmodule.html#!#prevent-reimport

constructor (@Optional() @SkipSelf() parentModule: CoreModule) {
  if (parentModule) {
   throw new Error(
    'CoreModule is already loaded. Import it in the AppModule only');
  }
 }

 但是我本地验证并不会有效的验证如何避免重复import一个模块。

问题4. 模块与路由的关系。

Angular2  NgModule 模块详解

基本上每个特性模块都有单独的路由定义,关于模块和路由的关系定义,下次说到ng2路由时再细说,因为ng2的路由太强大,以至于需要很长时间的理解才能明白。

ng2模块的目录和目录结构的最佳实践:

1.每个模块一个单独的文件夹

2.模块是高内聚 低耦合

3.模块内功能相关或相近

4.每个模块都有单独的路由定义 -不是必须

5.不要重复导入一些模块,必要的时候加入限制。 因为重复导入可能会影响依赖注入实例

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JS创建优美的页面滑动块效果 - Glider.js
Sep 27 Javascript
jquery对表单操作2
Apr 06 Javascript
Javascript跨域请求的4种解决方式
Mar 17 Javascript
原生js实现跨浏览器获取鼠标按键的值
Apr 08 Javascript
Jquery submit()无法提交问题
Apr 21 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
Jul 27 Javascript
node.js中使用socket.io的方法
Dec 15 Javascript
JavaScript关于提高网站性能的几点建议(一)
Jul 24 Javascript
利用js编写响应式侧边栏
Sep 17 Javascript
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
javascript高级模块化require.js的具体使用方法
Oct 31 Javascript
解决vue2中使用elementUi打包报错的问题
Sep 22 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
Oct 19 #Javascript
jQuery  ready方法实现原理详解
Oct 19 #Javascript
Javascript实现汉字和拼音互转的终极方案
Oct 19 #Javascript
Javascript typeof与instanceof的区别
Oct 18 #Javascript
javascript self对象使用详解
Oct 18 #Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 #Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 #Javascript
You might like
PHP 替换模板变量实现步骤
2009/08/24 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
php无限极分类实现方法分析
2019/07/04 PHP
网上抓的一个特效
2007/05/11 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
深入理解移动前端开发之viewport
2018/10/19 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
python openssl模块安装及用法
2020/12/06 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
大专毕业生自我鉴定
2013/11/21 职场文书
污水厂厂长岗位职责
2014/01/04 职场文书
终止合同协议书
2014/04/17 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
学生上课说话检讨书
2014/10/25 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
java实现面板之间切换功能
2022/06/10 Java/Android