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获取html对象的几种方式介绍
Dec 05 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
May 26 Javascript
javascript实现判断鼠标的状态
Jul 10 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
Jan 26 Javascript
js修改onclick动作的四种方法(推荐)
Aug 18 Javascript
[js高手之路]单例模式实现模态框的示例
Sep 01 Javascript
vue获取DOM元素并设置属性的两种实现方法
Sep 30 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
AngularJS 应用模块化的使用
Apr 04 Javascript
vuex actions传递多参数的处理方法
Sep 18 Javascript
Node.js安装详细步骤教程(Windows版)详解
Sep 01 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+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python程序中设置HTTP代理
2016/11/06 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
《埃及的金字塔》教学反思
2014/04/07 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
质量保证书格式模板
2015/02/27 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle